Was bedeutet "SyntaxError: Fehlende Klammern beim Aufruf von 'print'" in Python?

389

Wenn ich versuche, eine printAnweisung in Python zu verwenden, wird folgende Fehlermeldung angezeigt:

>>> print "Hello, World!"
  File "<stdin>", line 1
    print "Hello, World!"
                        ^
SyntaxError: Missing parentheses in call to 'print'

Was bedeutet das?

ncoghlan
quelle

Antworten:

601

Diese Fehlermeldung bedeutet, dass Sie versuchen, Python 3 zu verwenden, um einem Beispiel zu folgen oder ein Programm auszuführen, das die Python 2- printAnweisung verwendet:

print "Hello, World!"

Die obige Anweisung funktioniert in Python 3 nicht. In Python 3 müssen Sie den zu druckenden Wert in Klammern setzen:

print("Hello, World!")

"SyntaxError: Fehlende Klammern beim Aufruf von 'print'" ist eine neue Fehlermeldung, die in Python 3.4.2 hinzugefügt wurde, um Benutzern zu helfen, die versuchen, einem Python 2-Lernprogramm zu folgen, während sie Python 3 ausführen.

In Python 3 wurden die Druckwerte von einer eindeutigen Anweisung zu einem normalen Funktionsaufruf geändert, sodass jetzt Klammern erforderlich sind:

>>> print("Hello, World!")
Hello, World!

In früheren Versionen von Python 3 meldet der Interpreter lediglich einen generischen Syntaxfehler, ohne nützliche Hinweise darauf zu geben, was möglicherweise schief geht:

>>> print "Hello, World!"
  File "<stdin>", line 1
    print "Hello, World!"
                        ^
SyntaxError: invalid syntax

Der Grund, warum dies print in Python 3 zu einer gewöhnlichen Funktion wurde, bezog sich nicht auf die Grundform der Anweisung, sondern darauf, wie Sie kompliziertere Dinge wie das Drucken mehrerer Elemente auf stderr mit einem nachgestellten Leerzeichen erledigten, anstatt die Zeile zu beenden.

In Python 2:

>>> import sys
>>> print >> sys.stderr, 1, 2, 3,; print >> sys.stderr, 4, 5, 6
1 2 3 4 5 6

In Python 3:

>>> import sys
>>> print(1, 2, 3, file=sys.stderr, end=" "); print(4, 5, 6, file=sys.stderr)
1 2 3 4 5 6

Ab der Veröffentlichung von Python 3.6.3 im September 2017 wurden einige Fehlermeldungen im Zusammenhang mit der Python 2.x-Drucksyntax aktualisiert, um ihre Python 3.x-Gegenstücke zu empfehlen:

>>> print "Hello!"
  File "<stdin>", line 1
    print "Hello!"
                 ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Hello!")?

Da es sich bei dem Fall "Fehlende Klammern im Aufruf zum Drucken" um einen Syntaxfehler bei der Kompilierung handelt und daher Zugriff auf den Rohquellcode hat, kann der vollständige Text im Rest der Zeile in den vorgeschlagenen Ersatz aufgenommen werden. Derzeit wird jedoch nicht versucht, die entsprechenden Anführungszeichen für diesen Ausdruck zu finden (dies ist nicht unmöglich, nur so kompliziert, dass dies nicht geschehen ist).

Die TypeErrorfür den rechten Schichtfahrer erhöhte wurde ebenfalls angepasst:

>>> print >> sys.stderr
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for >>: 'builtin_function_or_method' and '_io.TextIOWrapper'. Did you mean "print(<message>, file=<output_stream>)"?

Da dieser Fehler beim Ausführen des Codes und nicht beim Kompilieren ausgelöst wird, hat er keinen Zugriff auf den Rohquellcode und verwendet daher Metavariablen ( <message>und <output_stream>) im vorgeschlagenen Ersetzungsausdruck anstelle dessen, was der Benutzer tatsächlich eingegeben hat . Im Gegensatz zum Syntaxfehlerfall ist es einfach, in der benutzerdefinierten Fehlermeldung für die Rechtsverschiebung Anführungszeichen um den Python-Ausdruck zu setzen.

ncoghlan
quelle
3
Mein Dank geht an @ antti-haapala für das Hinzufügen der Zusammenfassung oben, die die Frage direkt beantwortet, bevor
ich
Ich habe die Antwort auch auf das Community-Wiki umgestellt, da es für mich nicht richtig ist, ständig weitere SO- Mitarbeiter zu sammeln (siehe bugs.python.org/issue21669 für den Hintergrund, wie sich die Fehlermeldung und diese SO-Frage gemeinsam entwickelt haben)
ncoghlan
4
Hallo! Ich denke, dieses Tool kann jemandem helfen docs.python.org/2/library/2to3.html
Jhonatas Kleinkauff
1
Fügen Sie die Zeile aus der zukünftigen import print_function in Ihre 2.7-Datei ein, um Ihrem Code neue python 3 print () -Zeilen hinzuzufügen. Daher wird der Code kompatibel zu 2.7+ und 3.0+
Mastercontrol
Wie erzwingen Sie das System zur Verwendung von Python 2.7 vs 3? Vielleicht ist dies ein guter Ort dafür.
Praxiteles
25

Leider ist der alte xkcd-Comic nicht mehr ganz auf dem neuesten Stand.

https://imgs.xkcd.com/comics/python.png

Seit Python 3.0 müssen Sie schreiben:

print("Hello, World!")

Und jemand muss diese antigravityBibliothek noch schreiben :(

Christian
quelle
6
Antigravitation gibt es aber ... haben Sie versucht, es zu importieren? ;)
Tyrion
18

Die Syntax wurde von Python 2 zu Python 3 geändert. In Python 2

print "Hello, World!" 

funktioniert, aber in Python 3 verwenden Sie Klammern als

print("Hello, World!")

Dies entspricht der Syntax von Scala und Java.

Sagar Balai
quelle
4

Wenn Ihr Code sowohl in Python 2 als auch in Python 3 funktionieren soll, können Sie dies erreichen, indem Sie dies zu Beginn Ihres Programms laden:

from __future__ import print_function   # If code has to work in Python 2 and 3!

Dann können Sie auf Python 3-Weise drucken:

print("python")

Wenn Sie etwas drucken möchten, ohne eine neue Zeile zu erstellen, können Sie dies tun:

for number in range(0, 10):
    print(number, end=', ')
Lukasz
quelle
Hat bei Python3 trotz dieses Imports nicht funktioniert. Code ist ohne Klammern.
Logicbloke
3

In Python 3 können Sie nur drucken als:

print("STRING")

In Python 2 sind die Klammern jedoch nicht erforderlich.

Larry
quelle
3

Grundsätzlich müssen Sie seit Python 3.x verwenden print mit Klammern arbeiten.

Python 2.x : drucke "Herr der Ringe"

Python 3.x : print ("Herr der Ringe")


Erklärung

printeine war Anweisung in 2.x , aber es ist eine Funktion in 3.x . Dafür gibt es eine Reihe guter Gründe.

  1. Mit dem Funktionsformat von Python 3.x bietet sich mehr Flexibilität beim Drucken mehrerer Elemente mit getrenntem Komma.
  2. Sie können das Argument-Splatting nicht mit einer Anweisung verwenden. In 3.x können Sie Folgendes tun, wenn Sie eine Liste von Elementen haben, die Sie mit einem Trennzeichen drucken möchten:
>>> items = ['foo', 'bar', 'baz']
>>> print(*items, sep='+') 
foo+bar+baz
  1. Sie können eine Anweisung nicht überschreiben. Wenn Sie das Druckverhalten ändern möchten, können Sie dies tun, wenn es sich um eine Funktion handelt, nicht jedoch, wenn es sich um eine Anweisung handelt.
Om Sao
quelle
2

Ich könnte auch nur hinzufügen, dass ich alles über die Syntaxänderung zwischen Python2.7und wusste Python3und mein Code korrekt geschrieben wurde als print("string")und sogar print(f"string")...

Aber nach einiger Zeit des Debuggens wurde mir klar, dass mein Bash-Skript Python aufrief wie:

python file_name.py

Dies hatte den Effekt, dass mein Python-Skript standardmäßig aufgerufen wurde, python2.7wodurch der Fehler ausgegeben wurde. Also habe ich mein Bash-Skript geändert in:

python3 file_name.py

Welche von groben verwendet Python3, um das Skript auszuführen, das den Fehler behoben hat.

Alfa Bravo
quelle
Sie können auch einen Shebang am Anfang der Datei hinzufügen, um
anzugeben,
Das ist ja eine gute Idee!
Alfa Bravo
1

Außerhalb der direkten Antworten hier sollte man den anderen Hauptunterschied zwischen Python 2 und 3 beachten. Das offizielle Python-Wiki geht auf fast alle Hauptunterschiede ein und konzentriert sich darauf, wann Sie eine der Versionen verwenden sollten. Dieser Blog-Beitrag erklärt auch das aktuelle Python-Universum und das irgendwie ungelöste Rätsel, auf Python 3 umzusteigen.

Soweit ich das beurteilen kann, fangen Sie an, die Python-Sprache zu lernen. Sie sollten die oben genannten Artikel berücksichtigen, bevor Sie die Python 3-Route fortsetzen. Sie müssen nicht nur einen Teil Ihrer Syntax ändern, sondern auch darüber nachdenken, welche Pakete für Sie verfügbar sind (ein Vorteil von Python 2) und mögliche Optimierungen, die in Ihrem Code vorgenommen werden könnten (ein Vorteil von Python 3). .

Chad Van De Hey
quelle