Python没有搜索本地名称空间
我试图从另一个模块导入一个函数;但是,我不能使用Python没有搜索本地名称空间,python,python-2.7,python-internals,Python,Python 2.7,Python Internals,我试图从另一个模块导入一个函数;但是,我不能使用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):
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")
locals()。您不能通过它向局部变量添加新名称,也不能更改现有的局部变量
它是根据实际帧局部变量按需创建的字典,并且是单向的。从:
注:本词典内容不得修改;更改可能不会影响解释器使用的本地变量和自由变量的值
函数局部变量在编译时得到高度优化和确定,Python的基础是无法在运行时动态更改已知的局部变量
您可以从动态导入中返回一个对象,而不是直接尝试填充到局部变量中。在此处使用而不是\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
:
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)
那么,为什么我用同样的方式向globals()添加一些东西会起作用呢?@undeadherbs:因为globals()
不是这样的反映。局部变量对框架进行了高度优化。@undeadherbs局部变量和非局部变量在函数编译期间定义。允许动态更改将阻止优化,并允许出现其他一些意外情况