0
Python 2.7では、globalを{'__builtins__': None}
と定義することによって、evalによって使用される__builtins__
名前空間を制限することができました。これはPython 3.5では動作しないようです。Python 3.5でevalで__builtins__を適切に制限する方法は?
の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__
またはこれを回避しますか?
ありがとう、ありがとう。数学演算を評価する別の方法がありますか? '1 + 1'? AFIK、 'ast.literal_eval'はこれを許可しません。 – mrclary
'ast 'の他のコンポーネントは、あなたが望む言語のサブセットのパーサを構築するのに十分強力ですが、かなりの量の作業であり、属性アクセスを許可することについて非常に注意する必要があります'foo.bar'の点線の構文)。 – Kevin