(本番にこのようなコードを置く前に、最後にデフォルトのセキュリティ警告を参照してください!)
他の回答は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ライブラリを使用して、最後の行から離れたすべてのものを再構築します。最後の行は、前者を実行し、後者を評価します。
これは、あなたがeval
に接続する必要が義務付けセキュリティ警告でセキュリティ警告。特権を持たないユーザによって提供されるコードは Eval
とexec
であり、当然のことながら安全ではありません。このような場合は、別のアプローチを使用するか、ast.literal_evalを使用することをお勧めします。 eval
とexec
は、実際にあなたのユーザにpythonの完全な表現力を与えたい場合を除き、悪い考えです。
あなたの答えはここでした!これをDupeとしてマークする必要があります:P –
lol私はこれについてすべてを忘れました:P –
私はここからこれを捕まえましたhttp:// stackoverflow。com/questions/30671563/eval-not-working-on-multi-line-string#comment49405263_30671563:D –