SyntaxError en Python : d'où vient l'erreur et comment la corriger

SyntaxError signale un fichier que Python refuse de lire. Rien ne s'exécute : l'erreur est détectée avant même le démarrage du programme.
5 min de lecture
Believemy logo

Définition

Un script Python refuse parfois de se lancer sans qu'une seule de ses lignes ait eu la moindre chance de s'exécuter. L'écran affiche un message d'erreur, mais rien ne s'est produit avant lui : pas d'affichage, pas de calcul, pas même le début d'un traitement. Vous êtes devant une SyntaxError.

SyntaxError signale un fichier que Python ne parvient pas à lire. Elle appartient à une famille à part, la seule que Python détecte avant de commencer à exécuter quoi que ce soit. Cette particularité change la façon de la traiter : ce n'est pas une exception comme les autres, et un try posé autour du code ne sert à rien contre elle, puisqu'il n'est lui-même jamais atteint.

Voici à quoi ressemble le message le plus courant, des deux-points manquants en fin de ligne.

PYTHON
if age > 18
    print("Majeur")

# SyntaxError: expected ':'


Les causes, par ordre de fréquence

Un même petit groupe de fautes revient sans cesse d'un projet à l'autre. Les connaître à l'avance permet de reconnaître l'erreur au premier coup d'œil plutôt que de relire tout le fichier ligne par ligne.

Ce qui manque ou dérailleOù regarder
Deux-points absentsFin de ligne d'un if, for, def
Parenthèse ou guillemet non referméLa ligne signalée, mais surtout la précédente
Simple égal au lieu du doubleDans une condition
Mot réservé utilisé comme nomclass, import, in en variable
Version du langageUne écriture récente sur un Python ancien


Lire le numéro de ligne avec méfiance

Le réflexe naturel, devant un message d'erreur, est d'aller directement à la ligne indiquée. Avec une SyntaxError, ce réflexe trompe parfois : Python signale l'endroit où il a compris que quelque chose n'allait pas, ce qui n'est pas toujours l'endroit de la faute elle-même. Une parenthèse oubliée en fin de ligne 10 produit très souvent une erreur annoncée ligne 11, parce que le lecteur a continué, persuadé que l'expression se poursuivait, et n'a buté qu'en arrivant plus loin.

Le geste qui fait gagner le plus de temps consiste donc à regarder aussi la ligne précédant celle qui est signalée, pas seulement celle-ci. Depuis la version 3.10, les messages sont nettement plus précis et nomment souvent ce qui manque, comme le expected ':' de l'exemple ci-dessus : autant s'appuyer dessus avant de partir chercher plus loin.


La distinguer de ses voisines

Deux erreurs proches en découlent directement, au point qu'on les confond parfois avec elle. IndentationError et TabError sont des cas particuliers de SyntaxError : le fichier est syntaxiquement correct partout sauf sur l'indentation, mal alignée dans un cas, mêlant espaces et tabulations dans l'autre. Les trois produisent le même effet, rien ne démarre, et se corrigent de la même façon, en relisant le fichier plutôt qu'en cherchant une explication du côté de l'exécution.

À l'inverse, une NameError ou une TypeError surviennent pendant l'exécution, sur un code parfaitement lisible pour Python. Un test simple permet de trancher entre les deux familles : si un programme a affiché quoi que ce soit avant de s'arrêter, la lecture a réussi, et ce n'est jamais une erreur de syntaxe.


Le cas qui piège tout le monde

Un cas particulier mérite d'être vu une fois pour de bon, tant il revient souvent. Une parenthèse ouverte et jamais refermée ne provoque pas d'erreur là où elle se trouve, mais bien plus bas, parfois vingt lignes plus loin.

PYTHON
total = calculer(prix, quantite      # parenthèse jamais refermée
message = "Commande enregistrée"

# SyntaxError signalée sur la ligne du message, pas sur celle du calcul
Attention

Le message désigne alors une ligne parfaitement correcte, ce qui envoie chercher au mauvais endroit et fait perdre de longues minutes. Devant une erreur incompréhensible, la première chose à vérifier reste l'équilibre des parenthèses et des guillemets au-dessus, pas la ligne signalée elle-même.

Python continue de lire, persuadé que l'expression se poursuit, et n'abandonne qu'en rencontrant quelque chose d'impossible à interpréter. C'est ce délai entre la cause et le signalement qui rend le cas si trompeur.


Questions fréquentes

Question

Pourquoi rien ne s'exécute alors que l'erreur est à la fin du fichier ?

Parce que Python lit et compile l'intégralité du fichier avant de lancer la première ligne. Une faute de syntaxe à la ligne 200 empêche donc les 199 premières de tourner, contrairement à une erreur d'exécution qui, elle, laisse tourner ce qui la précède avant de s'arrêter.

Question

Peut-on attraper une SyntaxError avec try ?

Pas pour son propre fichier, puisque le try lui-même n'est jamais exécuté quand la faute se trouve dans le code qui l'entoure. Cela devient possible uniquement quand du code est chargé et compilé dynamiquement à l'exécution, ce qui reste un usage rare et spécialisé.

Question

Comment éviter ces erreurs au quotidien ?

Un éditeur configuré pour Python les signale en cours de frappe, avant même l'enregistrement du fichier. Les outils de formatage automatique refusent également de toucher à un fichier illisible, ce qui déplace la découverte de l'erreur au moment de l'écriture plutôt qu'au lancement du programme.

Termes connexes

Découvrez notre glossaire Python

Parcourez les termes et définitions les plus couramment utilisés dans le domaine du développement avec Python.

Partager cet article

Tu veux nous aider ? Fais un lien vers cet article sur tes réseaux ou encore mieux : sur ton site, dans un article ou dans ta newsletter.