Quando cerco di usare un'istruzione print
in Python, mi dà questo errore:
>>> print "Hello, World!"
File "<stdin>", line 1
print "Hello, World!"
^
SyntaxError: Missing parentheses in call to 'print'
Cosa significa?
Questo messaggio di errore significa che state tentando di usare Python 3 per seguire un esempio o eseguire un programma che usa l'istruzione Python 2 print
:
s>
print "Hello, World!"
{{{28212808}};
La dichiarazione di cui sopra non funziona in Python 3. In Python 3 dovete aggiungere le parentesi intorno al valore da stampare:
print("Hello, World!")
"SyntaxError: Missing parentheses in call to 'print' " è un nuovo messaggio di errore che è stato aggiunto in Python 3.4.2 principalmente per aiutare gli utenti che stanno cercando di seguire un tutorial di Python 2 mentre usano Python 3.
In Python 3, la stampa dei valori è passata dall'essere una dichiarazione distinta all'essere una normale chiamata di funzione, quindi ora ha bisogno di parentesi:
>>> print("Hello, World!")
Hello, World!
Nelle versioni precedenti di Python 3, l'interprete riporta semplicemente un generico errore di sintassi, senza fornire alcun suggerimento utile su cosa potrebbe andare storto:
>>> print "Hello, World!"
File "<stdin>", line 1
print "Hello, World!"
^
SyntaxError: invalid syntax
Per quanto riguarda il perché print
è diventato una funzione ordinaria in Python 3, questo non riguardava la forma base dell'istruzione, ma piuttosto il modo in cui si facevano cose più complicate come stampare elementi multipli su stderr con uno spazio finale piuttosto che terminare la linea.
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
A partire dal rilascio di Python 3.6.3 nel settembre 2017, alcuni messaggi di errore relativi alla sintassi di stampa di Python 2.x sono stati aggiornati per raccomandare le loro controparti di Python 3.x:
>>> print "Hello!"
File "<stdin>", line 1
print "Hello!"
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Hello!")?
Poiché il caso "Missing parentheses in call to print" è un errore di sintassi a tempo di compilazione e quindi ha accesso al codice sorgente grezzo, è in grado di includere il testo completo sul resto della linea nella sostituzione suggerita. Tuttavia, attualmente non cerca di capire quali sono le virgolette appropriate da mettere intorno a questa espressione (non è impossibile, è solo sufficientemente complicato che non è stato fatto).
Anche il TypeError
sollevato per l'operatore di spostamento a destra è stato personalizzato:
>>> 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>)"?
Poiché questo errore viene sollevato quando il codice viene eseguito, piuttosto che quando viene compilato, non ha accesso al codice sorgente grezzo, e quindi utilizza le meta-variabili (<message>
e <output_stream>
) nell'espressione di sostituzione suggerita invece di quello che l'utente ha effettivamente digitato. Diversamente dal caso dell'errore di sintassi, è semplice mettere le virgolette intorno all'espressione Python nel messaggio di errore di spostamento a destra personalizzato.
C'è un cambiamento nella sintassi da Python 2 a Python 3. In Python 2,
print "Hello, World!"
funzionerà, ma in Python 3, usate le parentesi come
print("Hello, World!")
Questa è la sintassi equivalente a Scala e vicina a Java.