我很难理解eval()
对于计算表达式中使用的全局变量的行为。
例如,以下脚本打印1
:
x = 1
print eval('x')
当以下脚本在
NameError: name 'x' is not defined
上失败时:x = 1
print eval('x', {})
但是,来自the documentation of
eval()
for my Python version(强调我的):expression参数作为一个python表达式(从技术上讲,是一个条件列表)进行解析和计算,使用globals和locals字典作为全局和本地名称空间。如果globals字典存在并且缺少'\uu内置'\uu',则在解析表达式之前,将当前globals复制到globals中。
因此,根据这一点,由于globals参数存在并且确实缺少
__builtins__
,我希望在计算表达式之前将所有当前的globals(包括x
)复制到其中;但显然情况并非如此我错过了什么? 最佳答案
这似乎是个虫子不管是文档中的bug还是实现中的bug,我都不知道,但是如果不存在,那么eval
不会将当前全局变量复制到globals
中相反,it only copies __builtins__
:
if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
if (PyDict_SetItemString(globals, "__builtins__",
PyEval_GetBuiltins()) != 0)
return NULL;
}
我在Python bug tracker上找不到任何相关信息,而且3.4和当前开发分支中仍然存在差异,因此可能值得提交错误报告和建议的文档更正:
如果globals字典存在且缺少“
__builtins__
”,则在解析表达式之前,将当前的__builtins__
复制到globals中。关于python - 为什么在使用globals参数运行eval时为什么不复制globals?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24934908/