如何在Python3.5中正确限制eval中的内置项?

如何在Python3.5中正确限制eval中的内置项?,python,python-2.7,python-3.x,eval,Python,Python 2.7,Python 3.x,Eval,在Python2.7中,我可以通过将全局定义为{''''''''''''''''''''''''''''''''''None}来限制eval使用的\''''''''.'内置'名称空间。这在Python3.5中似乎不起作用 Python 2.7正确地给出了NameError: In [1]: eval('round', {'__builtins__': None}) ------------------------------------------------------------------

在Python2.7中,我可以通过将全局定义为
{''''''''''''''''''''''''''''''''''None}
来限制eval使用的
\''''''''.'内置'
名称空间。这在Python3.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
[1]中的
:eval('round',{''u内置':None})
---------------------------------------------------------------------------
NameError回溯(最近一次呼叫上次)
在()
---->1评估('round',{'UUUUUUUUUUUU内置:无})
在()
NameError:未定义名称“round”
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>
[1]中的
:eval('round',{''u内置':None})
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1评估('round',{'UUUUUUUUUUUU内置:无})
在()
TypeError:“非类型”对象不可下标
两者都为以下各项提供了正确的输出:

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>
[1]中的
:eval('round')
出[1]:

如何正确限制
\uuuu内置项\uuuu
或解决此问题?

您可以将其设置为空字典:

eval('round', {'__builtins__': {}})

这将重现在Python2.x中得到的
NameError
。然而,沙箱Python,无论是2还是3,都是一个很好的例子。如果可能的话,您应该使用一些功能较弱的工具,例如,而不是
eval()

您可以将其设置为空字典:

eval('round', {'__builtins__': {}})

这将重现在Python2.x中得到的
NameError
。然而,沙箱Python,无论是2还是3,都是一个很好的例子。如果可能的话,您应该使用一些功能不太强大的工具,例如,而不是
eval()

非常好,谢谢。是否有其他方法来评估数学运算,例如“1+1”?AFIK,
ast.literal\u eval
不允许这样做。
ast
中的其他组件功能强大,足以为您想要的任何语言子集构建解析器。。。但是这可能需要大量的工作,在允许属性访问(即
foo.bar
虚线语法)时需要非常小心。非常好,谢谢。是否有其他方法来评估数学运算,例如“1+1”?AFIK,
ast.literal\u eval
不允许这样做。
ast
中的其他组件功能强大,足以为您想要的任何语言子集构建解析器。。。但是这可能需要大量的工作,并且在允许属性访问(即
foo.bar
虚线语法)时需要非常小心。