我试图导入一个未知名称的模块的成员。与其使用
import foo
我正在使用:
__import__("foo")
我该如何在不使用"eval"的情况下实现
from foo import bar
相似的功能?更新:看起来
fromlist
解决了问题。有没有一种方法可以模拟from foo import *
?fromlist=['*']
并不能解决问题。要模拟 from foo import *
,您可以使用 dir
来获取导入模块的属性:
foo = __import__('foo')
for attr in dir(foo):
if not attr.startswith('_'):
globals()[attr] = getattr(foo, attr)
通常不赞成使用from foo import *
,模拟它更是如此,我想。
__import__("foo", fromlist=["bar"])
了解更多信息,请参考help(__import__)
。
你可以通过__import__
动态导入。在__import__
中有一个fromlist
关键字参数,用于调用from foo import bar
。
def mother_function(module, *args, **kwargs):
from module import variable
return variable
def call_home_to_mamma():
import module_42
return mother_function(module_42)
def mother_function(module_name, *args, **kwargs):
exec('from %s import %s' % (module_name, variable))
variable = eval(variable)
return variable
def call_home_to_mamma():
import module_42
return mother_function(module_42.__name__)
太棒了...你可以在运行时从导入的模块中动态导入任何变量。