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局部变量和非局部变量在函数编译期间定义。允许动态更改将阻止优化,并允许出现其他一些意外情况