这怎么行得通?
global_function = """
x = "Hello World"
def print_global_x():
print(x)
print_global_x()
"""
exec(global_function, {"__builtins__": builtins})
但是这个看似等效的例子不起作用??
import builtins
class TestEnvironment(dict):
pass
global_env = TestEnvironment()
global_env['__builtins__'] = builtins
exec(global_function, global_env)
第二个示例给出错误,指出 x 未定义,但第一个示例完美运行。实际上,第二个示例似乎对代码进行了评估,就好像它被封装在类定义中一样,当两个 dict 对象传递给 exec 函数时就是这种情况,如文档中所述。
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-6-edb1f5a14344> in <module>()
9 """
10
---> 11 exec(global_function, global_env)
<string> in <module>()
<string> in print_global_x()
NameError: name 'x' is not defined
最佳答案
我知道原因了。显然,python 3.5.0 中存在一个已在 python 3.5.1 中解决的错误。我只是更新了我的 python 版本,代码就可以工作了。谢谢大家。
关于python - 将类似字典的对象传递给 exec 而不是 dict 对象会更改封装的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35993869/