如何在Python3.5中正确限制eval中的内置项?
在Python2.7中,我可以通过将全局定义为如何在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}) ------------------------------------------------------------------
{''''''''''''''''''''''''''''''''''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
虚线语法)时需要非常小心。