Python评估错误
获取错误:Python评估错误,python,Python,获取错误: x=5 print(eval('x+1',{'__builtins__': None})) 为什么我会犯以上的错误 另外,如何只为eval()函数指定几个内置方法?例如,只允许max和min功能。一种可能的解决方案是让当前全局端清除内置端 TypeError: 'NoneType' object is not subscriptable 从 \uuuuuuuuuuuuu内置项的值通常是此模块的值或此模块的\uuuuuuuu dict\uuuuuu属性的值 要修复错误,请执行以下操
x=5
print(eval('x+1',{'__builtins__': None}))
为什么我会犯以上的错误
另外,如何只为eval()函数指定几个内置方法?例如,只允许
max
和min
功能。一种可能的解决方案是让当前全局端清除内置端
TypeError: 'NoneType' object is not subscriptable
从
\uuuuuuuuuuuuu内置项的值通常是此模块的值或此模块的\uuuuuuuu dict\uuuuuu
属性的值
要修复错误,请执行以下操作:
x=5
dictionary = globals()
dictionary['__builtins__'] = None
print(eval('x+1',dictionary))
要指定一些内置方法,请将其提供给\uuu内置\uuu
>>> print(eval('x+1',{'__builtins__': {'x': x}}))
但是,限制\uuuuuuuuuuuuuuuuuuuuuuu内置\uuuuuuuuuu
仍然不安全:请参阅
为什么我会犯以上的错误
Python试图在您提供的内置代码中查找名称'x'
,但失败如下:
>>> print(eval('min(1,2)',{'__builtins__': {'min': min}}))
您还需要在范围中包括x
:
>>> None['x']
TypeError: 'NoneType' object is not subscriptable
如何仅为eval()函数指定几个内置方法
你不能用这种方式沙箱。例如,通过对文本的属性访问,总是可以逃逸沙箱。这也是为什么不定义“x”的原因,如果您这样做:
>>> x = 5
>>> eval('x+1', {'__builtins__': None, 'x': x})
6
您得到:NameError:name“x”未定义
,因为您覆盖了所有上下文
但如果你这么做:
x=5
print(eval("x+1",{'__builtins__': __builtins__}))
将打印“6”,但将使用所有内置函数,可能您只想执行以下操作:
x=5
print(eval("x+1"))
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
通常是一个模块。没有理由说它“应该”是一本字典。这是传递给eval
的第二个参数,它应该是一个字典。
x=5
print(eval("x+1",{'__builtins__': {'min': min, 'max': max, 'x': x}}))