我试图从另一个模块导入一个函数;但是,我无法使用import
,因为模块的名称需要在列表中查找。
如果我尝试通常调用导入的函数ExampleFunc
:
NameError: global name 'ExampleFunc' is not defined
然而;如果我明确地告诉python查看本地人,它会找到它。
文件module.py
def ExampleFunc(x):
print x
文件code.py
def imprt_frm(num,nam,scope):
for key, value in __import__(num,scope).__dict__.items():
if key==nam:
scope[key]=value
def imprt_nam(nam,scope):
imprt_frm("module",nam,scope)
def MainFunc(ary):
imprt_nam("ExampleFunc",locals())
#return ExampleFunc(ary) #fails
return locals()["ExampleFunc"](ary) #works
MainFunc("some input")
答案 0 :(得分:1)
locals()
字典只是实际本地数组的反射。您不能通过它向本地人添加新名称,也不能改变现有的本地人。
它是根据实际帧本地创建的字典,仅为单向。来自locals()
function documentation:
注意:不应修改此词典的内容;更改可能不会影响解释器使用的本地和自由变量的值。
函数本地文件在编译时经过高度优化和确定,Python构建为无法在运行时动态更改已知的本地文件。
您可以从动态导入中返回一个对象,而不是直接尝试填充本地。使用importlib
module而不是__import__
此处:
import importlib
def import_frm(module_name, name):
module = importlib.import_module(module_name)
return getattr(module, name)
然后只分配一个本地名称:
def MainFunc(ary):
ExampleFunc = import_from('module' , 'ExampleFunc')
ExampleFunc(ary)