Keď sa pokúsim použiť príkaz print
v jazyku Python, vyhodí mi to túto chybu:
>>> print "Hello, World!"
File "<stdin>", line 1
print "Hello, World!"
^
SyntaxError: Missing parentheses in call to 'print'
Čo to znamená?
Táto chybová správa znamená, že sa pokúšate použiť Python 3 na sledovanie príkladu alebo spustenie programu, ktorý používa príkaz print
jazyka Python 2:
print "Hello, World!"
Vyššie uvedený príkaz nefunguje v Pythone 3. V Pythone 3 musíte okolo hodnoty, ktorá sa má vypísať, pridať zátvorky:
print("Hello, World!")
"SyntaxError: Chýbajúce zátvorky vo volaní príkazu 'print' " je nové chybové hlásenie, ktoré bolo pridané do Pythonu 3.4.2 najmä preto, aby pomohlo používateľom, ktorí sa snažia sledovať výučbový program Python 2 pri spustení Pythonu 3.
V Pythone 3 sa tlač hodnôt zmenila z odlišného príkazu na obyčajné volanie funkcie, takže teraz potrebuje zátvorky:
>>> print("Hello, World!")
Hello, World!
V predchádzajúcich verziách Pythonu 3 interpret len hlásil všeobecnú syntaktickú chybu bez toho, aby poskytol užitočné informácie o tom, čo môže byť zle:
>>> print "Hello, World!"
File "<stdin>", line 1
print "Hello, World!"
^
SyntaxError: invalid syntax
Pokiaľ ide o to, prečo sa print
stalo v Pythone 3 obyčajnou funkciou, netýkalo sa to základného tvaru príkazu, ale skôr toho, ako ste robili zložitejšie veci, ako napríklad tlač viacerých položiek na stderr s koncovou medzerou namiesto ukončenia riadku.
V jazyku Python 2:
>>> import sys
>>> print >> sys.stderr, 1, 2, 3,; print >> sys.stderr, 4, 5, 6
1 2 3 4 5 6
V Pythone 3:
>>> import sys
>>> print(1, 2, 3, file=sys.stderr, end=" "); print(4, 5, 6, file=sys.stderr)
1 2 3 4 5 6
Počnúc vydaním Pythonu 3.6.3 v septembri 2017 boli niektoré chybové hlásenia súvisiace so syntaxou tlače Pythonu 2.x aktualizované tak, aby odporúčali svoje náprotivky pre Python 3.x:
>>> print "Hello!"
File "<stdin>", line 1
print "Hello!"
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Hello!")?
Keďže prípad "Chýbajúce zátvorky vo volaní print" je syntaktickou chybou v čase kompilácie, a teda má prístup k surovému zdrojovému kódu, dokáže do navrhovanej náhrady zahrnúť celý text na zvyšku riadku. V súčasnosti sa však nepokúša zistiť, aké vhodné úvodzovky je potrebné umiestniť okolo tohto výrazu (nie je to nemožné, len dostatočne komplikované, aby sa to neurobilo).
Bola tiež upravená chyba TypeError
, ktorá sa vyskytne pri operátore pravého posunu:
>>> 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>)"?
Keďže táto chyba je vyvolaná pri spustení kódu, a nie pri jeho kompilácii, nemá prístup k surovému zdrojovému kódu, a preto používa meta-premenné (<message>
a <output_stream>
) v navrhovanom náhradnom výraze namiesto toho, čo používateľ skutočne napísal. Na rozdiel od prípadu syntaktickej chyby je'jednoduché umiestniť úvodzovky okolo výrazu jazyka Python vo vlastnej chybovej správe pravého posunu.
V syntaxi došlo k zmene z Pythonu 2 na Python 3. V Pythone 2,
print "Hello, World!"
bude fungovať, ale v Pythone 3 použite zátvorky ako
print("Hello, World!")
Toto je syntax ekvivalentná so Scalou a blízka Jave.