Python: Получите детали модуля импорта из импортированного модуля

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

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

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

mod1:

from mod2 import f
f(...)

mod2:

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(...)

mod2:

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)
6
задан Jake 12 January 2010 в 01:10
поделиться

1 ответ

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

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

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

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

.
6
ответ дан 17 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: