(Ver la advertencia de seguridad por defecto al final antes de poner código como este en producción!)
Las otras respuestas hacen un buen trabajo de explicar la diferencia entre exec
y eval
.
Sin embargo, me encontré que quieran tomar la entrada como x=1; y=2; x+y
en lugar de forzar a la gente escriben: la manipulación
def f():
x = 1
y = 2
return x + y
cadena de código para construir este tipo de función es un negocio arriesgado.
Terminé usando el siguiente enfoque:
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)
Este analiza el código Python; usa la biblioteca ast para reconstruir un ast de todo aparte de la última línea; y la última línea, que exime a la primera y evalúa la posterior.
advertencia de seguridad
Esta es la advertencia de seguridad obligatorio que tiene que adjuntar a eval
. Eval
'ing y exec
' El código proporcionado por un usuario no privilegiado es, por supuesto, inseguro. En estos casos, es posible que prefiera utilizar otro enfoque, o considere ast.literal_eval. eval
y exec
tienden a ser malas ideas a menos que realmente desee darle a su usuario el poder expresivo completo de python.
Vaya. Tu respuesta estuvo aquí! Debería haber marcado eso como dupe: P –
jaja Me olvidé de todo esto: P –
Lo capté desde aquí http: // stackoverflow.com/questions/30671563/eval-not-working-on-multi-line-string # comment49405263_30671563: D –