Risposte:
Questo messaggio di errore indica che stai tentando di utilizzare Python 3 per seguire un esempio o eseguire un programma che utilizza l' printistruzione Python 2 :
print "Hello, World!"
L'istruzione precedente non funziona in Python 3. In Python 3 è necessario aggiungere parentesi attorno al valore da stampare:
print("Hello, World!")
"SyntaxError: parentesi mancanti nella chiamata a 'stampa'" è un nuovo messaggio di errore che è stato aggiunto in Python 3.4.2 principalmente per aiutare gli utenti che stanno cercando di seguire un'esercitazione su Python 2 mentre eseguono Python 3.
In Python 3, i valori di stampa sono cambiati da un'istruzione distinta in 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 solo un errore di sintassi generico, 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 motivo per cui èprint diventata una normale funzione in Python 3, che non si riferiva alla forma base dell'istruzione, ma piuttosto al modo in cui hai fatto cose più complicate come stampare più elementi 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 dalla versione Python 3.6.3 a settembre 2017, alcuni messaggi di errore relativi alla sintassi di stampa Python 2.x sono stati aggiornati per raccomandare le loro controparti 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 "Parentesi mancanti nella chiamata alla stampa" è un errore di sintassi in fase di compilazione e quindi ha accesso al codice sorgente non elaborato, è in grado di includere il testo completo sul resto della riga nella sostituzione suggerita. Tuttavia, al momento non tenta di elaborare le virgolette appropriate da posizionare attorno a quell'espressione (non è impossibile, è sufficientemente complicato da non essere stato fatto).
Anche il TypeErrorrialzo per l'operatore del cambio 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 generato quando il codice viene eseguito, anziché quando viene compilato, non ha accesso al codice sorgente non elaborato e quindi utilizza meta-variabili ( <message>e <output_stream>) nell'espressione di sostituzione suggerita invece di qualsiasi cosa l'utente abbia effettivamente digitato . A differenza del caso di errore di sintassi, è semplice inserire virgolette intorno all'espressione Python nel messaggio di errore di spostamento a destra personalizzato.
Sfortunatamente, il vecchio fumetto di xkcd non è più completamente aggiornato.
Da Python 3.0 devi scrivere:
print("Hello, World!")
E qualcuno deve ancora scrivere quella antigravitylibreria :(
C'è un cambiamento nella sintassi da Python 2 a Python 3. In Python 2,
print "Hello, World!"
funzionerà ma in Python 3, usa le parentesi come
print("Hello, World!")
Questa è sintassi equivalente a Scala e vicino a Java.
Se il tuo codice dovrebbe funzionare sia in Python 2 che in 3, puoi farlo caricandolo all'inizio del tuo programma:
from __future__ import print_function # If code has to work in Python 2 and 3!
Quindi è possibile stampare in modo Python 3:
print("python")
Se vuoi stampare qualcosa senza creare una nuova linea, puoi farlo:
for number in range(0, 10):
print(number, end=', ')
Fondamentalmente, da Python 3.x è necessario utilizzare printtra parentesi.
Python 2.x : stampa "Il Signore degli Anelli"
Python 3.x : print ("Il Signore degli Anelli")
printEra una dichiarazione in 2.x , ma è una funzione in 3.x . Ora, ci sono una serie di buoni motivi per questo.
>>> items = ['foo', 'bar', 'baz'] >>> print(*items, sep='+') foo+bar+baz
Potrei anche solo aggiungere che sapevo tutto sulla modifica della sintassi tra Python2.7e Python3e il mio codice è stato scritto correttamente come print("string")e persino
print(f"string")...
Ma dopo qualche tempo di debug mi sono reso conto che il mio script bash chiamava python come:
python nome_file.py
che ha avuto l'effetto di chiamare il mio script Python di default usando python2.7quale ha dato l'errore. Quindi ho cambiato il mio script bash in:
python3 nome_file.py
quale di massima utilizza python3 per eseguire lo script che ha corretto l'errore.
Al di fuori delle risposte dirette qui, si dovrebbe notare l'altra differenza chiave tra python 2 e 3. La wiki ufficiale di python esamina quasi tutte le differenze principali e si concentra su quando dovresti usare una delle versioni. Questo post sul blog fa anche un ottimo lavoro nel spiegare l'attuale universo di Python e il puzzle in qualche modo irrisolto del passaggio a Python 3.
Per quanto ne so, stai iniziando a imparare il linguaggio Python. Dovresti prendere in considerazione gli articoli di cui sopra prima di continuare lungo il percorso di Python 3. Non solo dovrai modificare parte della sintassi, ma dovrai anche pensare a quali pacchetti saranno disponibili (un vantaggio di Python 2) e alle potenziali ottimizzazioni che potrebbero essere apportate nel tuo codice (un vantaggio di Python 3) .