如何将作用域扩展到exec函数?

2024-06-02 06:14:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含多个函数定义的模块对象。这里是一个简化的例子

源代码(组成模块“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

是否可以将局部(甚至全局)范围扩展到正在执行的函数


1条回答
网友
1楼 · 发布于 2024-06-02 06:14:20

您不需要“扩展范围”。您的问题是您在错误的名称空间中进行操作。执行模块代码时:

exec(byte_code, __builtins__, my_module.__dict__)

当您应该使用模块的名称空间作为全局名称空间时,使用内置名称空间作为全局名称空间:

exec(byte_code, my_module.__dict__)

然后模块的函数将具有正确的全局命名空间。目前,它们都使用内置名称空间作为全局名称空间

另外,不要对内置名称空间使用__builtins__。这是一个实现细节,它甚至不像你想象的那样工作——它的价值在不同的环境中是不同的。有时它被设置为builtins模块本身,而不是该模块的dict。相反,如果需要内置dict,可以使用import builtinsbuiltins.__dict__

相关问题 更多 >