我正在编写一段可重用的代码来导入我需要它的地方,但它需要一些关于导入它的信息。我有一个解决方法可以做我想要的,但它有点难看。还有更好的方法吗?
以下是我正在做的简化版本。
我想要的是什么:导入一个方法并使用它,但在mod2中查看f。它需要导入模块中的一些信息。
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)
答案 0 :(得分:5)
这是个坏主意,因为模块是缓存的。
因此,如果另一个模块(例如mod3.py
)也导入mod2
,那么它将首次获得相同的mod2
对象。该模块不会重新导入。
也许您在自己导入mod2
之前导入了导入mod2
的其他模块,然后您就不再导入mod2
了。模块只导入一次。
因此,您应该使用另一种可重用的方法,而不是试图让谁导入模块。也许使用类并传递实例?