2017-05-28 2 views
0

Code:Syntaxerror: print funktioniert nicht in eval()

eval("print('foobar')") 

Ausgang:

Traceback (most recent call last): 
    File "Untitled.py", line 30, in <module> 
    eval("print('foobar')") 
    File "<string>", line 1 
    print('foobar') 
     ^
SyntaxError: invalid syntax 

Was mache ich falsch?

+1

Was ist Ihre Python-Version? – gzc

+0

Da es einen 'SyntaxError' gibt, ist es python-2.x. Sie benötigen 'exec' für Anweisungen wie' print' in python 2. – MSeifert

+0

w.r.t. das Duplikat: Ich stimme, das offen zu lassen. Das potenzielle Duplikat erwähnt ausdrücklich nicht "print", so dass in Bezug auf Internet-Suchanfragen die aktuelle Frage offen bleiben würde. – kfx

Antwort

2

print ist ein Operator in Python 2 und eine Funktion in Python 3. Welche Version verwenden Sie?

+0

^Dies ist im Wesentlichen die richtige Antwort. 'eval' arbeitet nur mit Ausdrücken. In Python 3 ist 'print' eine Funktion, und daher ist ihre Verwendung ein gültiger Ausdruck. In Python 2 ist seine Verwendung eine Anweisung, kein Ausdruck, daher wird sie nicht ausgewertet. Siehe https://stackoverflow.com/questions/22558548/eval-syntaxerror-invalid-syntax-in-python für weitere Informationen – daveruinseverything

+0

Wenn Sie den "welche Version verwenden Sie" Teil entfernen und sagen, das ist der Grund, warum es auf Python fehlschlägt -2.x wäre es eine noch bessere Antwort. – MSeifert

+0

Mit Python 2, also ich möchte exec() dann? Macht viel Sinn, danke –

1

eval wertet Ausdrücke, keine Aussagen, so müssen Sie es die printFunktion passieren, nicht die printAussage. Standardmäßig ist print eine Anweisung in Python 2 und die print-Anweisung in Python 3 nicht vorhanden. Die print-Funktion ist jedoch in den neuesten Versionen von Python 2 über einen __future__ Import verfügbar. Die print-Funktion ist tatsächlich in diesen Versionen von Python 2 definiert, aber sie wird von der print-Anweisung maskiert; Der Import macht die print-Anweisung nicht verfügbar, wodurch die print-Funktion verfügbar gemacht wird.

Demo, getestet auf Python 2.6.6:

from __future__ import print_function 

eval("print('foobar')")  

Ausgang

foobar 

BTW, ist es in der Regel nicht eine gute Idee eval oder exec zu verwenden, es sei denn, Du hast keine Alternative. Sie sind relativ langsam und haben Sicherheitsrisiken, wenn Sie ihnen nicht analysierte Zeichenfolgen zum Auswerten/Ausführen übergeben. Für Details siehe bitte Eval really is dangerous von SO Veteran Ned Batchelder. Um einfache Python-Literale auszuwerten, können Sie ast.literal_eval verwenden.

Verwandte Themen