Ich versuche, die folgende Tab-eingerückte Zeichenfolge auszuwerten:
%Vor%Ich bekomme, "Es gab einen Fehler: ungültige Syntax, Zeile 1"
Worüber beklagen sie sich? Muss ich einrücken, um der eval () -Anweisung zu entsprechen, oder schreibe ich sie in eine Zeichenkette oder temporäre Datei und führe diese oder etwas anderes aus?
Danke,
eval
bewertet Sachen wie 5+3
exec
führt Sachen wie for ...
Um solche Anweisungen mit eval
zu verwenden, sollten Sie sie zuerst in das Code-Objekt konvertieren, indem Sie compile()
:
Wir bewerten ( eval
) Ausdrücke und führen sie aus ( exec
).
Siehe: Ausdruck gegen Aussage .
Ausdruck: Etwas, das zu einem Wert auswertet. Beispiel: 1 + 2 / x
Statement: Eine Codezeile, die etwas bewirkt. Beispiel: GOTO 100
(Siehe Standard-Sicherheitswarnung am Ende, bevor Sie einen solchen Code in Produktion nehmen!)
Die anderen Antworten erklären den Unterschied zwischen exec
und eval
sehr gut.
Trotzdem habe ich festgestellt, dass ich Eingaben wie x=1; y=2; x+y
verwenden möchte, anstatt die Leute zum Schreiben zu zwingen:
String Manipulation von Code, um diese Art von Funktion zu erstellen, ist ein riskantes Geschäft.
Ich habe den folgenden Ansatz verwendet:
%Vor%Dies analysiert den Python-Code; verwendet die ast-Bibliothek, um ein ast von allem außer der letzten Zeile wiederherzustellen; und die letzte Zeile, die die erstere ausdrückt und die später auswertet.
Dies ist die obligatorische Sicherheitswarnung, die Sie an eval
anhängen müssen.
Eval
'ing und exec
' ing code, der von einem nicht-privilegierten Benutzer bereitgestellt wird, ist natürlich unsicher. In diesen Fällen bevorzugen Sie vielleicht einen anderen Ansatz oder betrachten as.literal_eval. eval
und exec
neigen dazu, schlechte Ideen zu sein, es sei denn, Sie möchten Ihrem Benutzer die volle Ausdruckskraft von Python geben.
Tags und Links python eval python-3.x metaprogramming