(Vedi avviso di protezione di default alla fine prima di mettere il codice come questo in produzione!)
Le altre risposte fanno un buon lavoro di spiegare la differenza tra exec
e eval
.
Tuttavia, mi sono trovato a voler prendere in ingresso come x=1; y=2; x+y
piuttosto che costringere la gente a scrivere: la manipolazione
def f():
x = 1
y = 2
return x + y
stringa di codice per costruire questo tipo di funzione è un affare rischioso.
ho finito per usare il seguente approccio:
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)
Questo analizza codice Python; usa la libreria ast per ricostruire un elemento di tutto diverso dall'ultima riga; e l'ultima riga, eseguendo la prima e valutando la successiva.
avvertimento Security
Questo è l'avviso di protezione obbligatoria che si deve allegare al eval
. Eval
'it e exec
' il codice fornito da un utente non privilegiato è ovviamente insicuro. In questi casi potresti preferire un altro approccio o considerare ast.literal_eval. eval
ee exec
tendono ad essere idee sbagliate a meno che tu non voglia effettivamente dare al tuo utente tutta la potenza espressiva di python.
fonte
2017-01-04 20:25:29
Oops. La tua risposta era qui! Dovrei averlo contrassegnato come dupe: P –
lol Mi sono dimenticato di tutto questo: P –
Ho preso questo da qui http: // StackOverflow.it/questions/30671563/eval-not-working-on-multi-line-string # comment49405263_30671563: D –