(このようなコードを本番環境に配置する前に、最後にあるデフォルトのセキュリティ警告を参照してください!)
exec
他の回答は、 と の違いをうまく説明していeval
ます。
それにもかかわらず、私はx=1; y=2; x+y
人々に書くことを強制するのではなく、次のような入力を取りたいと思っていました:
def f():
x = 1
y = 2
return x + y
この種の関数を構築するためのコードの文字列操作は、リスクの高いビジネスです。
私は次のアプローチを使用することになりました:
def multiline_eval(expr, context):
"Evaluate several lines of input, returning the result of the last line"
tree = ast.parse(expr)
eval_expr = ast.Expression(tree.body[-1].value)
exec_expr = ast.Module(tree.body[:-1])
exec(compile(exec_expr, 'file', 'exec'), context)
return eval(compile(eval_expr, 'file', 'eval'), context)
これは Python コードを解析します。ast ライブラリを使用して、最後の行以外のすべての ast を再構築します。そして最後の行で、前者を実行し、後者を評価します。
セキュリティ警告
これは、添付する必要がある必須のセキュリティ警告ですeval
。
特権のないユーザーが提供するコードをEval
'ing および'ing することは、もちろん安全ではありません。exec
このような場合、別のアプローチを使用するか、ast.literal_eval を検討することをお勧めします。eval
そして、exec
実際にユーザーに python の完全な表現力を与えたくない場合を除いて、悪い考えになる傾向があります。