>>> eval('potato', {'__builtins__': None})NameError: name 'potato' is not definedPython2。很有道理。>>> eval('potato', {'__builtins__': None})TypeError: 'NoneType' object is not subscriptablePython 3.如何/为什么eval尝试下标None?我在NameError这里也希望如此,或者可能是AttributeError: 'NoneType' object has no attribute 'potato'。
1 回答
![?](http://img1.sycdn.imooc.com/54586870000183e302200220-100-100.jpg)
慕妹3242003
TA贡献1824条经验 获得超6个赞
从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__
的全局命名空间中查找名称可以找到与代码块的执行相关联的内建命名空间。这应该是字典或模块(在后一种情况下,将使用模块的字典)。
添加回答
举报
0/150
提交
取消