Python eval错误

Pan*_*kaj 2 python

x=5
print(eval('x+1',{'__builtins__': None}))
Run Code Online (Sandbox Code Playgroud)

得到错误:

TypeError: 'NoneType' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)

为什么我会出错?

另外,如何只为eval()函数指定一些内置方法?例如,仅允许maxmin功能.

c2h*_*2hu 6

来自builtins文档:

__builtins__通常是此模块[builtins]或此模块__dict__属性的值

要修复错误:

>>> print(eval('x+1',{'__builtins__': {'x': x}}))
Run Code Online (Sandbox Code Playgroud)

要指定一些内置方法,请提供它 __builtins__

>>> print(eval('min(1,2)',{'__builtins__': {'min': min}}))
Run Code Online (Sandbox Code Playgroud)

但是,限制__builtins__仍然不安全:请参阅https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html