为什么eval尝试在__builtins__上下标?

>>> eval('potato', {'__builtins__': None})

NameError: name 'potato' is not defined

Python2。很有道理。


>>> eval('potato', {'__builtins__': None})

TypeError: 'NoneType' object is not subscriptable

Python 3.如何/为什么eval尝试下标None?我在NameError这里也希望如此,或者可能是AttributeError: 'NoneType' object has no attribute 'potato'。



ABOUTYOU
浏览 192回答 1
1回答

慕妹3242003

从eval(expression, globals=None, locals=None) 文档:如果存在globals字典且缺少' __builtins__',则在解析表达式之前将当前的globals复制到globals中。这意味着表达式通常可以完全访问标准 __builtin__模块,并且可以传播受限环境。但是您在globals字典中设置__builtins__为None,因此您的代码将评估None['potato']导致以下结果的原因:TypeError: 'NoneType' object is not subscriptable编辑:Python2.7提出NameError,如果它没有找到在变量__builtins__-源代码。NAME_ERROR_MSG定义为:#define NAME_ERROR_MSG \ "name '%.200s' is not defined"Python3打印不同的消息-请参阅源-PyObject_GetItem不会引发,KeyError但是TypeError在这种情况下,字符串的格式是不同的TypeError: 'NoneType' object is not subscriptable在CPython中,名称__builtins__可以绑定到模块或字典。这记录在执行模型下:实际上,通过在代码块__builtins__的全局命名空间中查找名称可以找到与代码块的执行相关联的内建命名空间。这应该是字典或模块(在后一种情况下,将使用模块的字典)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python