Python: получение сведений об импорте изнутри импортированного модуля - PullRequest
4 голосов
/ 08 января 2010

Я пишу фрагмент кода для повторного использования, чтобы импортировать его туда, где он мне нужен, но ему нужна некоторая информация о том, что его импортирует. У меня есть обходной путь, который делает то, что я хочу, но это немного уродливо. Есть ли лучший способ?

Вот упрощенная версия того, что я делаю.

Что я хочу: Импортируйте метод и используйте его, но посмотрите на f в mod2. Требуется информация из модуля импорта.

mod1:

from mod2 import f
f(...)

mod 2:

from things_i_want import parent_module, importing_module
def f(*args, **kwargs):
    from importing_module.parent_module import models
    # ... do some stuff with it, including populating v with a string

    v = 'some_string'
    m = getattr(importing_module, v, None)
    if callable(m)
        return m(*args, **kwargs)

Мой уродливый обходной путь:

mod1:

from mod2 import f as _f
def f(*a, **k):return _f(__name__, globals(), *a, **k)
f(...)

mod 2:

def f(module_name, globs, *args, **kwargs):
    # find parent modules path
    parent_module_path = module_name.split('.')[0:-1]
    # find models modules path
    models_path = parent_module_path + ['models',]
    # import it
    models = __import__('.'.join(models_path), {}, {}, [''])
    # ... do some stuff with it, including populating v with a string

    v = 'some_string'
    if v in globs:
        return globs[v](*args, **kwargs)

1 Ответ

6 голосов
/ 08 января 2010

Это плохая идея, потому что модули кэшируются.

Так что, если другой модуль, скажем, mod3.py, также импортирует mod2, он получит тот же самый объект mod2 в первый раз. Модуль не был повторно импортирован.

Может быть, вы импортировали какой-то другой модуль, который импортировал mod2, прежде чем импортировать mod2 самостоятельно, тогда вы больше не импортируете mod2. Модули импортируются только один раз.

Так что вместо того, чтобы пытаться выяснить, кто импортировал модуль, вы должны использовать другой, многократно используемый подход. Возможно, используя классы и передавая экземпляр?

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