在python 2.7中,我可以通过将global定义为__builtins__
来限制eval使用的{'__builtins__': None}
命名空间。这在Python 3.5中似乎不起作用。
Python 2.7正确地给出了NameError:
In [1]: eval('round', {'__builtins__': None})
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-14-dc1cae9c6b26> in <module>()
----> 1 eval('round', {'__builtins__': None})
<string> in <module>()
NameError: name 'round' is not defined
Python 3.5提供以下内容:
In [1]: eval('round', {'__builtins__': None})
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-83a8846287f1> in <module>()
----> 1 eval('round', {'__builtins__': None})
<string> in <module>()
TypeError: 'NoneType' object is not subscriptable
两者都为以下内容提供了正确的输出:
In [1]: eval('round')
Out[1]: <function round>
如何正确限制__builtins__
或解决此问题?
答案 0 :(得分:2)
您可以将其设置为空字典:
eval('round', {'__builtins__': {}})
这将重现Python 2.x中的NameError
。但是,沙盒Python(无论是2还是3)都是inherently hard problem。如果可能,您应该使用功能较弱的内容,例如ast.literal_eval()
而不是eval()
。