Я пишу фрагмент кода для повторного использования, чтобы импортировать его туда, где он мне нужен, но ему нужна некоторая информация о том, что его импортирует. У меня есть обходной путь, который делает то, что я хочу, но это немного уродливо. Есть ли лучший способ?
Вот упрощенная версия того, что я делаю.
Что я хочу: Импортируйте метод и используйте его, но посмотрите на 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)