我有一个包含多个函数定义的模块对象。这里是一个简化的例子
源代码(组成模块“my_模块”)
def functionA():
print("hello")
def functionB():
functionA()
print("world")
这个模块是用imp构建的(我知道它已经贬值了,但我的应用程序仍然在python 3.5上)
ast_node = parse(source)
byte_code = compile(ast_node, 'my_module', 'exec')
my_module = imp.new_module('my_module')
exec(byte_code, __builtins__, my_module.__dict__)
我正在尝试使用exec
运行functionB()
,并将完整模块__dict__
作为本地字典传递。(我也尝试过将其作为全球词典传入,但没有任何运气)
exec("functionB()", None, my_module.__dict__)
我看到的错误是NameError: name 'functionA' is not defined
是否可以将局部(甚至全局)范围扩展到正在执行的函数
您不需要“扩展范围”。您的问题是您在错误的名称空间中进行操作。执行模块代码时:
当您应该使用模块的名称空间作为全局名称空间时,使用内置名称空间作为全局名称空间:
然后模块的函数将具有正确的全局命名空间。目前,它们都使用内置名称空间作为全局名称空间
另外,不要对内置名称空间使用
__builtins__
。这是一个实现细节,它甚至不像你想象的那样工作——它的价值在不同的环境中是不同的。有时它被设置为builtins
模块本身,而不是该模块的dict。相反,如果需要内置dict,可以使用import builtins
和builtins.__dict__
相关问题 更多 >
编程相关推荐