python - 将类似字典的对象传递给 exec 而不是 dict 对象会更改封装的范围

标签 python

这怎么行得通?

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/

相关文章:

python - 根据参数绘制具有不同颜色的曲线

python - OpenCv 视频显示 PyQt5

python - 根据 Pandas DataFrame 中其他列的条件创建新列

python - 如何修复未正确复制的元胞自动机/空间囚徒困境

python - 如何循环读取巨型CSV文件

Python:列表字典的排序表示,在删除重复项后按列表中元素的数量排序

Python数据框: Calculating Confidence or Prediction Intervals Using Groupby on One Column

python - Photoshop 操作脚本失败

python - 在列表中提到某些关键字后对字符串进行切片

python - AttributeError : module 'dis' has no attribute '_unpack_opargs' While Building Python 3. 6 可执行使用 CX_FREEZE