为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ABOUTYOU 2021-05-06 18:58:10
>>> 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 回答

?
慕妹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__的全局命名空间中查找名称可以找到与代码块的执行相关联的内建命名空间。这应该是字典或模块(在后一种情况下,将使用模块的字典)。


查看完整回答
反对 回复 2021-05-18
  • 1 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信