Python没有搜索locals名称空间

时间:2015-01-27 18:43:13

标签: 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):
    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")

1 个答案:

答案 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)