Når jeg forsøger at bruge en print
-anvisning i Python, får jeg denne fejl:
>>> print "Hello, World!"
File "<stdin>", line 1
print "Hello, World!"
^
SyntaxError: Missing parentheses in call to 'print'
Hvad betyder det?
Denne fejlmeddelelse betyder, at du forsøger at bruge Python 3 til at følge et eksempel eller køre et program, der bruger Python 2 print
-erklæringen:
print "Hello, World!"
Ovenstående erklæring virker ikke i Python 3. I Python 3 skal du tilføje parenteser omkring den værdi, der skal udskrives:
print("Hello, World!")
"SyntaxError: Manglende parenteser i kald til 'print' " er en ny fejlmeddelelse, der blev tilføjet i Python 3.4.2 primært for at hjælpe brugere, der forsøger at følge en Python 2-vejledning, mens de kører Python 3.
I Python 3 er udskrivning af værdier ændret fra at være en særskilt erklæring til at være et almindeligt funktionskald, så det har nu brug for parenteser:
>>> print("Hello, World!")
Hello, World!
I tidligere versioner af Python 3 rapporterede fortolkeren blot en generisk syntaksfejl uden at give nogen nyttige hints om, hvad der kunne være galt:
>>> print "Hello, World!"
File "<stdin>", line 1
print "Hello, World!"
^
SyntaxError: invalid syntax
Med hensyn til hvorfor print
blev en almindelig funktion i Python 3, havde det ikke noget at gøre med den grundlæggende form af erklæringen, men snarere med hvordan man gjorde mere komplicerede ting som at udskrive flere elementer til stderr med et afsluttende mellemrum i stedet for at afslutte linjen.
I Python 2:
>>> import sys
>>> print >> sys.stderr, 1, 2, 3,; print >> sys.stderr, 4, 5, 6
1 2 3 4 5 6
I 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
Fra og med udgivelsen af Python 3.6.3 i september 2017 er nogle fejlmeddelelser relateret til Python 2.x-udskriftssyntaksen blevet opdateret, så de anbefaler deres Python 3.x-modstykker:
>>> print "Hello!"
File "<stdin>", line 1
print "Hello!"
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Hello!")?
Da "Manglende parenteser i kald til print" tilfældet er en syntaksfejl på kompileringstidspunktet og dermed har adgang til den rå kildekode, er det's i stand til at inkludere den fulde tekst på resten af linjen i den foreslåede erstatning. Den forsøger dog ikke i øjeblikket at finde ud af, hvilke anførselstegn der skal sættes omkring udtrykket (det er ikke umuligt, men blot tilstrækkeligt kompliceret til, at det ikke er blevet gjort).
Den TypeError
, der opstår ved højre shift-operator, er også blevet tilpasset:
>>> 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 denne fejl opstår, når koden køres, og ikke når den kompileres, har den ikke adgang til den rå kildekode, og den bruger derfor meta-variabler (<message>
og <output_stream>
) i det foreslåede erstatningsudtryk i stedet for det, brugeren faktisk har indtastet. I modsætning til syntaksfejl er det ukompliceret at placere anførselstegn omkring Python-udtrykket i den brugerdefinerede fejlmeddelelse med højre skift.
Der er sket en ændring i syntaksen fra Python 2 til Python 3. I Python 2,
print "Hello, World!"
fungerer, men i Python 3 skal du bruge parenteser som
print("Hello, World!")
Dette er tilsvarende syntaks til Scala og tæt på Java.