Python评估错误

时间:2018-08-02 18:16:52

标签: python

x=5
print(eval('x+1',{'__builtins__': None}))

获取错误:

TypeError: 'NoneType' object is not subscriptable

为什么我会遇到以上错误?

此外,如何仅为eval()函数指定一些内置方法?例如,仅允许maxmin函数。

4 个答案:

答案 0 :(得分:6)

builtins docs:

  

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

要纠正您的错误:

>>> print(eval('x+1',{'__builtins__': {'x': x}}))

要指定一些内置方法,请将其提供给__builtins__

>>> print(eval('min(1,2)',{'__builtins__': {'min': min}}))

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

答案 1 :(得分:1)

  

为什么我会遇到错误?

Python尝试在您提供的内置文件中寻找名称'x',但失败了:

>>> None['x']
TypeError: 'NoneType' object is not subscriptable

您还需要在范围内包括x

>>> x = 5
>>> eval('x+1', {'__builtins__': None, 'x': x})
6
  

如何仅为eval()函数指定一些内置方法?

您不能用这种方式沙箱。总是有可能逃脱沙箱,例如通过对文字的属性访问。

答案 2 :(得分:0)

一种可能的解决方案是让当前的全局变量清除内置变量

x=5
dictionary = globals()
dictionary['__builtins__'] = None
print(eval('x+1',dictionary))

答案 3 :(得分:0)

与之相同的原因也是为什么您没有得到定义'x':

x=5
print(eval("x+1",{'__builtins__': __builtins__}))

您得到:NameError: name 'x' is not defined,因为您覆盖了所有上下文。

但如果您只是这样做:

x=5
print(eval("x+1"))

将打印'6',但将使用所有内置函数,也许您只想这样做:

x=5
print(eval("x+1",{'__builtins__': {'min': min, 'max': max, 'x': x}}))