Warum lehnt Python eval () diese mehrzeilige Zeichenfolge ab und wie kann ich sie beheben?

8

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,

    
JonathanHayward 02.10.2012, 20:44
quelle

4 Antworten

20

eval bewertet Sachen wie 5+3

exec führt Sachen wie for ...

aus %Vor%     
Joran Beasley 02.10.2012 20:47
quelle
11

Um solche Anweisungen mit eval zu verwenden, sollten Sie sie zuerst in das Code-Objekt konvertieren, indem Sie compile() :

verwenden %Vor%     
Ashwini Chaudhary 02.10.2012 20:52
quelle
5

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

    
Andy Hayden 02.10.2012 20:53
quelle
2

(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:

%Vor%

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.

Sicherheitswarnung

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.

    
Att Righ 04.01.2017 20:25
quelle