Que signifie «SyntaxError: parenthèses manquantes dans l'appel à« imprimer »» en Python?


389

Lorsque j'essaie d'utiliser une printinstruction en Python, cela me donne cette erreur:

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

Qu'est-ce que ça veut dire?

Réponses:


601

Ce message d'erreur signifie que vous essayez d'utiliser Python 3 pour suivre un exemple ou exécuter un programme qui utilise l' printinstruction Python 2 :

print "Hello, World!"

L'instruction ci-dessus ne fonctionne pas dans Python 3. Dans Python 3, vous devez ajouter des parenthèses autour de la valeur à imprimer:

print("Hello, World!")

«SyntaxError: Parenthèses manquantes dans l'appel à« imprimer »» est un nouveau message d'erreur qui a été ajouté dans Python 3.4.2 principalement pour aider les utilisateurs qui tentent de suivre un didacticiel Python 2 lors de l'exécution de Python 3.

Dans Python 3, les valeurs d'impression sont passées d'une instruction distincte à un appel de fonction ordinaire, il a donc besoin de parenthèses:

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

Dans les versions antérieures de Python 3, l'interpréteur signale simplement une erreur de syntaxe générique, sans fournir de conseils utiles sur ce qui pourrait mal se passer:

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

Quant à savoir pourquoi print est devenu une fonction ordinaire dans Python 3, cela ne concernait pas la forme de base de l'instruction, mais plutôt la façon dont vous avez fait des choses plus compliquées comme l'impression de plusieurs éléments sur stderr avec un espace de fin plutôt que de terminer la ligne.

En Python 2:

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

En 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

Depuis la version Python 3.6.3 de septembre 2017, certains messages d'erreur liés à la syntaxe d'impression Python 2.x ont été mis à jour pour recommander leurs homologues Python 3.x:

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

Étant donné que le cas «Parenthèses manquantes dans l'appel à imprimer» est une erreur de syntaxe de compilation et a donc accès au code source brut, il est capable d'inclure le texte intégral sur le reste de la ligne dans le remplacement suggéré. Cependant, il n'essaie pas actuellement de trouver les citations appropriées à placer autour de cette expression (ce n'est pas impossible, juste suffisamment compliqué pour que cela ne soit pas fait).

Le TypeErrorsurélevé pour l'opérateur de changement de droite a également été personnalisé:

>>> 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>)"?

Étant donné que cette erreur est générée lors de l'exécution du code, plutôt que lors de sa compilation, elle n'a pas accès au code source brut et utilise donc des méta-variables ( <message>et <output_stream>) dans l'expression de remplacement suggérée au lieu de tout ce que l'utilisateur a tapé . Contrairement au cas d'erreur de syntaxe, il est simple de placer des guillemets autour de l'expression Python dans le message d'erreur de décalage à droite personnalisé.


3
Mes remerciements à @ antti-haapala pour avoir ajouté le résumé en haut qui répond directement à la question avant de continuer avec l'explication plus longue des origines du message d'erreur :)
ncoghlan

J'ai également changé la réponse sur le wiki de la communauté, car accumuler régulièrement plus de représentants SO pour cela ne me semble pas juste (voir bugs.python.org/issue21669 pour le contexte sur la façon dont le message d'erreur et cette question SO ont évolué)
ncoghlan

4
salut! Je pense que cet outil peut aider quelqu'un docs.python.org/2/library/2to3.html
Jhonatas Kleinkauff

1
Ajoutez la ligne de future import print_function dans votre fichier 2.7 pour ajouter de nouvelles lignes print () python 3 à votre code. Par conséquent, le code devient compatible avec les versions 2.7+ et 3.0+
MasterControlProgram

Comment forcez-vous le système à utiliser Python 2.7 vs 3? C'est peut-être un bon endroit pour cela.
Praxiteles


18

Il y a un changement de syntaxe de Python 2 à Python 3. En Python 2,

print "Hello, World!" 

fonctionnera mais en Python 3, utilisez des parenthèses comme

print("Hello, World!")

C'est une syntaxe équivalente à Scala et proche de Java.


4

Si votre code doit fonctionner à la fois en Python 2 et 3, vous pouvez y parvenir en chargeant ceci au début de votre programme:

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

Ensuite, vous pouvez imprimer de la manière Python 3:

print("python")

Si vous souhaitez imprimer quelque chose sans créer de nouvelle ligne, vous pouvez le faire:

for number in range(0, 10):
    print(number, end=', ')

N'a pas fonctionné pour moi en Python3 même avec cette importation. Le code est sans parenthèses.
logicbloke

3

Dans Python 3, vous pouvez uniquement imprimer en tant que:

print("STRING")

Mais en Python 2, les parenthèses ne sont pas nécessaires.


3

Fondamentalement, depuis Python 3.x, vous devez utiliser printdes parenthèses.

Python 2.x : imprimer "Le Seigneur des anneaux"

Python 3.x : print ("Le Seigneur des anneaux")


Explication

printétait une déclaration dans 2.x , mais il est une fonction dans 3.x . Maintenant, il y a plusieurs bonnes raisons à cela.

  1. Avec le format de fonction de Python 3.x, plus de flexibilité vient lors de l'impression de plusieurs éléments avec une virgule séparée.
  2. Vous ne pouvez pas utiliser l'éclatement d'arguments avec une instruction. Dans 3.x si vous avez une liste d'éléments que vous souhaitez imprimer avec un séparateur, vous pouvez le faire:
>>> items = ['foo', 'bar', 'baz']
>>> print(*items, sep='+') 
foo+bar+baz
  1. Vous ne pouvez pas remplacer une déclaration. Si vous voulez changer le comportement de l'impression, vous pouvez le faire quand c'est une fonction mais pas quand c'est une instruction.

2

Je pourrais également ajouter que je savais tout sur le changement de syntaxe entre Python2.7et Python3, et mon code a été correctement écrit comme print("string")et même print(f"string")...

Mais après un certain temps de débogage, j'ai réalisé que mon script bash appelait python comme:

python nom_fichier.py

ce qui a eu pour effet d'appeler mon script python par défaut en utilisant python2.7ce qui a donné l'erreur. J'ai donc changé mon script bash en:

python3 nom_fichier.py

lequel de gros utilise python3 pour exécuter le script qui a corrigé l'erreur.


Vous pouvez également ajouter un shebang en haut du fichier pour indiquer avec quel Python charger le fichier
OneCricketeer

C'est une bonne idée oui!
Alfa Bravo

1

En dehors des réponses directes ici, il convient de noter l'autre différence clé entre python 2 et 3. Le wiki officiel de python va dans presque toutes les différences majeures et se concentre sur quand vous devez utiliser l'une ou l'autre des versions. Cet article de blog explique également très bien l'univers actuel de Python et le casse-tête non résolu de passer à Python 3.

Autant que je sache, vous commencez à apprendre le langage python. Vous devriez considérer les articles susmentionnés avant de continuer sur la route python 3. Non seulement vous devrez changer une partie de votre syntaxe, mais vous devrez également penser aux packages qui seront disponibles pour vous (un avantage de python 2) et aux optimisations potentielles qui pourraient être faites dans votre code (un avantage de python 3) .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.