Как настроить глобально для каждого импортированного файла в Python автоматически? - PullRequest
2 голосов
/ 17 октября 2011

У меня большой код на python со многими модулями и классами.У меня есть специальный класс, единственный экземпляр которого нужен везде по всему коду (это потоковое приложение, и этот экземпляр класса также содержит локальное хранилище потоков, блокировки и т. Д.).Немного неудобно всегда «заполнять» этот экземпляр в каждом импортируемом модуле.Я знаю, что использование globals - не лучшая практика, но в любом случае: есть ли в python «ловушка для импорта», так что я могу сделать это, чтобы мой экземпляр был доступен во всех модулях без дополнительной работы?Он должен работать как для обычного импорта, так и для импорта из мода ... и для конструкций import .Если это невозможно, можете ли вы предложить лучшее решение?Конечно, не весело передавать этот экземпляр конструкторам всех классов и т. Д. Наследование также не помогает, поскольку у меня есть модули без классов, а также мне нужен один экземпляр, а не сам класс ...

class master():
    def import_module(self, name):
        mod = __import__(name)
        mod.m = self
        return mod
[...]
m = master()

В настоящее время я думаю нечто подобное: но тогда я должен использовать m.import_module () для импорта модулей, тогда другие модули будут иметь экземпляр мастер-класса с именем «m», поэтому я могу использоватьm.import_module () тоже и т. д. Но тогда я должен отказаться от использования «обычных» операторов импорта, и я должен написать это:

example_mod = m.module_import("example_mod")

вместо этого:

import example_mod

(но наверняка я тоже могу это сделать, чтобы потом назначить "m" для example_mod.m)

Ответы [ 2 ]

4 голосов
/ 17 октября 2011

Конечно, не весело передавать этот экземпляр конструкторам всех классов

Вам не нужно этого делать.Настройте свой глобальный класс в модуле типа config и импортируйте его

# /myapp/enviroment/__init__.py

class ThatSingleInstanceClass: pass

# create the singleton object directly or have a function init the module
singleton = ThatSingleInstanceClass() 



# /myapp/somewhere.py

# all you need to use the object is importing it
from myapp.enviroment import singleton

class SomeClass:

    def __init__(self): # no need to pass that object
        print "Always the same object:", singleton
2 голосов
/ 17 октября 2011

Что плохого в том, чтобы каждый модуль импортировал нужный объект? Явное лучше, чем неявное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...