Python est indulgent sur bien des points, mais pas son analyseur syntaxique. Une SyntaxError arrête votre programme avant qu'une seule ligne s'exécute, ce qui est frustrant quand la correction se résume souvent à un seul caractère manquant. La bonne nouvelle, c'est qu'une poignée d'erreurs récurrentes explique presque toutes les erreurs de syntaxe que vous rencontrerez, et une fois que vous savez les reconnaître, vous les corrigez en quelques secondes.
Ce guide passe en revue les erreurs de syntaxe Python les plus courantes, ainsi que les cas étroitement liés de IndentationError, TabError et NameError qui font trébucher les développeurs pour les mêmes raisons. Chaque section présente un extrait de code erroné, le message d'erreur que Python affiche, et la version corrigée. Chaque extrait est réel et copiable, vous pouvez donc reproduire l'erreur et vérifier la correction dans votre propre interpréteur.
Qu'est-ce qu'une erreur de syntaxe en Python ?
Une erreur de syntaxe signifie que votre code ne respecte pas la grammaire du langage, de sorte que l'interpréteur ne peut pas l'analyser et en faire quelque chose d'exécutable. Comme l'analyse syntaxique a lieu avant l'exécution, le programme ne démarre jamais : rien ne s'affiche, aucun effet de bord ne se produit, vous obtenez simplement une trace qui se termine par SyntaxError avec un curseur pointant vers le token fautif, ou juste après.
Voici l'exemple canonique : un appel sans parenthèse fermante.
print("Hello, Python!"
Python atteint la fin du fichier en attendant toujours le ) qui ferme l'appel, et signale donc le problème en fin de fichier.
SyntaxError: '(' was never closed
Un point important à intégrer tôt dans votre modèle mental : une erreur de syntaxe n'est pas la même chose qu'une erreur d'exécution. Les erreurs de syntaxe sont détectées à l'analyse et empêchent le programme de démarrer. Les erreurs d'exécution, comme une division par zéro ou l'ouverture d'un fichier inexistant, surviennent pendant l'exécution d'un programme syntaxiquement valide. Ce guide porte sur le premier type : celles qui empêchent votre code de s'exécuter.
Erreurs de syntaxe Python courantes et comment les corriger
Les sections ci-dessous suivent à peu près l'ordre dans lequel vous rencontrerez ces erreurs. Chacune est courte et autonome, vous pouvez donc aller directement au message d'erreur que vous regardez en ce moment.
1. Parenthèses manquantes ou non appariées
Les parenthèses groupent les expressions et appellent les fonctions, et elles doivent être équilibrées. Une parenthèse ouvrante non fermée est l'une des erreurs de syntaxe les plus courantes, notamment dans les conditions plus longues où il est facile d'oublier la fermeture.
if (x > 10: print("x is greater than 10")
Python attend une parenthèse fermante avant les deux-points et vous le signale.
SyntaxError: closing parenthesis ':' does not match opening parenthesis '('
La correction consiste à s'assurer que chaque crochet ouvrant a une fermeture correspondante du même type. Fermez la parenthèse avant les deux-points et la condition sera analysée sans problème. La même règle s'applique aux crochets [] et aux accolades {} ; les éditeurs qui mettent en évidence les crochets correspondants en détectent la plupart automatiquement.
if (x > 10): print("x is greater than 10")
2. Deux-points manquants dans une instruction de contrôle
Chaque en-tête d'instruction composée en Python se termine par des deux-points : if, elif, else, for, while, def, class, try, et les autres. Omettre les deux-points est une erreur classique quand on vient d'un langage qui utilise des accolades à la place.
if x > 5 print("x is greater than 5")
Python moderne pointe directement vers le token manquant.
SyntaxError: expected ':'
Ajoutez les deux-points à la fin de la ligne d'en-tête. Chaque fois que vous écrivez une instruction qui démarre un nouveau bloc indenté, votre œil doit automatiquement vérifier la présence des deux-points finaux.
if x > 5: print("x is greater than 5")
3. Bloc indenté attendu (IndentationError)
Python utilise l'indentation à la place des accolades pour délimiter les blocs de code, donc le corps de chaque if, boucle ou fonction doit être indenté. Si vous écrivez un en-tête avec des deux-points sans indenter la ligne suivante, l'analyseur n'a aucun bloc à rattacher.
for i in range(5): print(i)
L'interpréteur signale qu'il attendait un bloc indenté après l'en-tête de la boucle.
IndentationError: expected an indented block after 'for' statement on line 1
Indentez le corps avec quatre espaces, la convention standard en Python. L'indentation est ici la syntaxe, pas un choix stylistique : c'est ainsi que Python sait quelles lignes appartiennent à la boucle.
for i in range(5): print(i)
4. Indentation inattendue (IndentationError)
L'erreur opposée consiste à indenter une ligne qui devrait se trouver au même niveau que ses voisines. L'indentation doit être cohérente dans un bloc, donc un espace ou deux supplémentaires sur une ligne brisent l'analyse.
def example(): print("First line") print("Second line")
Le deuxième print est indenté plus que le premier sans raison, et Python le rejette.
IndentationError: unexpected indent
Alignez chaque instruction d'un même bloc à la même colonne. Choisissez quatre espaces par niveau et restez uniforme, et l'auto-indentation de votre éditeur fera généralement le reste.
def example(): print("First line") print("Second line")
5. Mélange de tabulations et d'espaces (TabError)
Un bug d'indentation particulièrement sournois est le mélange de tabulations et d'espaces dans le même bloc. Les deux peuvent sembler identiques à l'écran, mais Python les traite différemment et lève une TabError dédiée. Dans l'extrait ci-dessous, la première ligne du corps utilise des espaces et la seconde une tabulation.
def greet(name): message = "Hi " + name return message
Même si les deux lignes s'alignent visuellement, Python ne peut pas déterminer si elles sont au même niveau.
TabError: inconsistent use of tabs and spaces in indentation
Optez pour les espaces, comme le recommande PEP 8, et ne mélangez jamais. Configurez votre éditeur pour insérer des espaces quand vous appuyez sur Tab, et effectuez un remplacement global sur tout fichier contenant déjà un mélange. Ré-indenter les deux lignes du corps avec quatre espaces élimine l'erreur.
Les bugs tabulation/espace sont invisibles jusqu'à ce que vous activiez le rendu des espaces blancs. La plupart des éditeurs proposent une option « afficher les espaces » ou « afficher les caractères de contrôle » qui dessine les tabulations et les espaces comme des marques distinctes. Activez-la une fois et ces erreurs cesseront d'être mystérieuses.
6. Fin de ligne dans un littéral de chaîne (EOL)
Une chaîne doit s'ouvrir et se fermer sur la même ligne avec des guillemets correspondants. Oubliez le guillemet fermant, ou fermez avec le mauvais type, et Python atteint la fin de la ligne en étant toujours à l'intérieur de la chaîne.
name = 'John"
La chaîne s'ouvre avec un guillemet simple mais se ferme avec un guillemet double, donc elle n'est jamais terminée.
SyntaxError: unterminated string literal (detected at line 1)
Utilisez le même type de guillemet aux deux extrémités. Si votre texte contient un guillemet, entourez la chaîne de l'autre type, par exemple "O'Brien", ou utilisez une chaîne entre guillemets triples pour un texte qui s'étend sur plusieurs lignes. Les versions plus anciennes de Python formulent cette même erreur comme EOL while scanning string literal, mais la cause est identique.
name = 'John'
7. Fin de fichier inattendue (EOF)
La version fin-de-fichier est étroitement liée : un crochet ouvrant ou un guillemet qui n'est jamais fermé avant la fin du fichier. C'est le cas de l'appel non fermé mentionné plus tôt, et il mérite sa propre section car le message d'erreur pointe vers une cause différente. Une structure multi-lignes avec un fermant manquant est le coupable habituel.
numbers = [1, 2, 3 print(sum(numbers))
Comme la liste n'est jamais fermée, Python continue de lire, traite la ligne suivante comme faisant partie de la liste, et dépasse la fin du fichier.
SyntaxError: '[' was never closed
Fermez le crochet là où la structure se termine. Quand une erreur pointe vers la toute fin d'un fichier, la vraie cause est presque toujours un ouvrant plusieurs lignes au-dessus qui n'a jamais été apparié : remontez à partir du curseur.
numbers = [1, 2, 3] print(sum(numbers))
8. Affectation invalide : = versus ==
Un seul = affecte une valeur ; un double == compare deux valeurs. Utiliser l'affectation là où une comparaison est attendue, par exemple dans une condition if, provoque un rejet de Python car on ne peut pas affecter dans un test conditionnel ordinaire.
if x = 10: print("x is 10")
Les versions récentes de Python sont explicites sur ce que vous vouliez probablement dire.
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
Utilisez == pour comparer et réservez = à l'affectation. Si vous souhaitez vraiment affecter dans une expression, c'est le rôle de l'opérateur walrus :=, mais pour une condition ordinaire, vous voulez presque toujours ==.
if x == 10: print("x is 10")
Une fois que votre analyseur tourne proprement, la partie difficile d'un scraper est la récupération : rendre les pages JavaScript et faire tourner les IP pour éviter d'être bloqué. La Crawling API gère les deux derrière une seule requête et renvoie le HTML terminé, pour que votre Python sans erreur puisse analyser des données plutôt que de combattre une flotte de navigateurs headless et un pool de proxies.
9. Utilisation d'un mot-clé réservé comme nom
Python réserve des mots comme for, if, class, return et import pour le langage lui-même. Essayez d'en utiliser un comme nom de variable et l'analyseur verra un mot-clé là où il attend un identifiant.
for = 10
Affecter à for est invalide car for ne peut que démarrer une boucle.
SyntaxError: invalid syntax
Choisissez un nom qui n'est pas réservé, de préférence un qui décrit la valeur. Si vous n'êtes pas sûr qu'un nom est pris, le module keyword de Python liste tous les mots réservés ; vérifier un nom dans keyword.kwlist tranche la question instantanément.
import keyword num_for = 10 print("for" in keyword.kwlist) # True, so it is off limits
10. Virgules mal placées ou manquantes
Les virgules séparent les éléments dans les listes, tuples, dictionnaires et listes d'arguments. Oubliez-en une entre deux littéraux de chaîne et Python essaie de les lire comme une seule expression, ce qui est invalide.
items = ["apple" "banana", "cherry"]
Python pointe vers la deuxième chaîne, là où une virgule était attendue.
SyntaxError: invalid syntax. Perhaps you forgot a comma?
Mettez une virgule entre chaque élément. Ce piège est fréquent car Python concatène silencieusement deux littéraux de chaîne adjacents : "apple" "banana" se parse parfois sans erreur et produit "applebanana", un bug déroutant plutôt qu'un échec propre. Séparez toujours vos éléments explicitement par des virgules.
items = ["apple", "banana", "cherry"]
11. Instructions d'importation incorrectes
Les imports ont leur propre grammaire. Oubliez de nommer ce que vous importez et la forme from ... import reste incomplète.
from math import
L'analyseur atteint la fin de la ligne en attendant toujours un nom à importer.
SyntaxError: invalid syntax
Nommez ce que vous importez, ou importez le module entier. Les deux formes ci-dessous sont valides : importer le module et accéder à son contenu avec la notation pointée, ou extraire des noms spécifiques.
import os import sys from math import sqrt
12. print comme instruction plutôt que comme fonction
En Python 2, print était une instruction et s'écrivait sans parenthèses. En Python 3, c'est une fonction ordinaire, donc l'ancienne forme est une erreur de syntaxe. Cela pose encore problème aux personnes qui copient des exemples d'anciens tutoriels.
print "Hello, Python!"
Python 3 suggère même la correction dans le message.
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
Entourez les arguments de parenthèses, comme pour tout autre appel de fonction. La même règle s'applique à exec, qui est également devenu une fonction en Python 3.
print("Hello, Python!")
13. NameError causé par une faute de frappe
Ce dernier cas n'est pas strictement une erreur de syntaxe : le code est analysé correctement, donc l'échec survient à l'exécution plutôt qu'à l'analyse. Il figure ici car la cause appartient à la même famille de petites erreurs, et la correction est tout aussi rapide. Mal orthographier un nom de variable et Python ne peut pas le trouver.
message = "hello" print(mesage)
Le nom mesage n'a jamais été défini, donc Python lève une NameError et propose utilement ce que vous vouliez probablement écrire.
NameError: name 'mesage' is not defined. Did you mean: 'message'?
Corrigez l'orthographe pour que le nom corresponde à sa définition. Comme cette erreur n'apparaît que lorsque la ligne s'exécute réellement, elle peut se cacher dans une branche rarement atteinte, ce qui est une raison supplémentaire de tester votre code par petits morceaux plutôt que tout d'un coup.
message = "hello" print(message)
Comment éviter les erreurs de syntaxe Python
Vous ne cesserez jamais entièrement de faire ces erreurs, mais vous pouvez en détecter presque toutes avant d'exécuter quoi que ce soit. Quelques habitudes font l'essentiel du travail.
- Utilisez un éditeur avec coloration syntaxique. VS Code, PyCharm et même des éditeurs légers comme Thonny signalent les crochets non appariés, les mauvaises indentations et les chaînes cassées au fil de la frappe, de sorte que la plupart des erreurs n'atteignent jamais l'interpréteur.
-
Choisissez quatre espaces et ne mélangez jamais avec des tabulations. Configurez votre éditeur pour insérer des espaces quand vous appuyez sur Tab. Une indentation cohérente seule supprime toute la famille
IndentationErroretTabError. - Exécutez un linter. Des outils comme Pylint, Flake8 et Ruff analysent votre code pour détecter les problèmes de syntaxe, les virgules manquantes et les noms indéfinis avant l'exécution, et la plupart s'intègrent directement dans votre éditeur.
- Lisez le message d'erreur et le curseur. Python moderne pointe vers le token exact et suggère souvent la correction. Le numéro de ligne indique où Python a remarqué le problème, ce qui pour les crochets non fermés est généralement une ou deux lignes en dessous de la vraie cause.
- Testez par petits morceaux. Exécutez quelques lignes à la fois plutôt qu'un script entier. Les erreurs sont bien plus faciles à localiser quand seules quelques nouvelles lignes peuvent en être responsables.
Ces mêmes habitudes maintiennent votre code propre une fois que vous passez des exemples simples aux projets réels, y compris les scrapers. Si vous souhaitez un guide complet qui met Python au travail, voir comment scraper un site web avec Python, et pour un tour des outils que vous utiliserez, les meilleures bibliothèques Python pour le web scraping.
Points clés
- Les erreurs de syntaxe arrêtent le programme avant son exécution. Contrairement aux erreurs d'exécution, elles sont détectées à l'analyse, donc rien ne s'exécute tant que vous ne les corrigez pas.
- La plupart des erreurs de syntaxe sont de la ponctuation. Un deux-points manquant, un crochet non fermé, un guillemet non apparié ou une virgule oubliée expliquent la grande majorité des cas.
- L'indentation est de la syntaxe, pas du style. Indentez les corps de blocs de façon cohérente, utilisez quatre espaces et ne mélangez jamais tabulations et espaces, ce qui évite toute la famille IndentationError et TabError.
- = affecte et == compare. Utiliser l'un à la place de l'autre est une erreur fréquente que Python moderne signale maintenant directement.
- Lisez le message et le curseur. Les versions récentes de Python nomment le token exact et suggèrent souvent la correction, et pour les erreurs de fin de fichier, la vraie cause est généralement un ouvrant non fermé plus haut.
Foire aux questions
Quelle est la différence entre une erreur de syntaxe et une erreur d'exécution en Python ?
Une erreur de syntaxe brise la grammaire du langage, de sorte que l'interpréteur ne peut pas analyser votre code et le programme ne démarre jamais. Une erreur d'exécution survient pendant l'exécution d'un programme valide, quand une opération échoue, comme une division par zéro ou l'ouverture d'un fichier inexistant. Les erreurs de syntaxe sont détectées avant l'exécution ; les erreurs d'exécution sont détectées pendant celle-ci.
Pourquoi Python accorde-t-il autant d'importance à l'indentation ?
Python utilise l'indentation à la place des accolades pour définir les blocs de code, ce qui rend le code lisible et uniforme. Comme l'espace blanc est la syntaxe, une indentation incohérente est une véritable erreur, pas un simple défaut de style. Choisissez quatre espaces par niveau et laissez votre éditeur l'appliquer, et l'indentation cessera d'être une source de bugs.
Comment corriger "SyntaxError: unexpected EOF while parsing" ?
Ce message signifie qu'un crochet ouvrant, une parenthèse ou un guillemet n'a jamais été fermé, de sorte que Python a dépassé la fin du fichier en attendant le fermant. Commencez à la ligne indiquée par l'erreur et remontez pour trouver un ouvrant non apparié. Les versions plus récentes de Python formulent le même problème de façon plus précise, par exemple '(' was never closed, ce qui vous indique exactement quel caractère chercher.
Pourquoi est-ce que j'obtiens une TabError alors que mon code semble correctement indenté ?
Parce que les tabulations et les espaces peuvent sembler identiques à l'écran, alors que Python les traite comme des caractères différents. Si une ligne dans un bloc utilise une tabulation et une autre des espaces, l'indentation est incohérente même si elle s'aligne visuellement. Activez le rendu des espaces blancs dans votre éditeur, convertissez tout en espaces, et l'erreur disparaît.
Comment puis-je détecter les erreurs de syntaxe avant d'exécuter mon code ?
Utilisez un éditeur avec coloration syntaxique et un linter comme Pylint, Flake8 ou Ruff. Ces outils signalent les crochets non appariés, les virgules manquantes, les mauvaises indentations et les noms indéfinis au fil de la frappe, de sorte que la plupart des erreurs n'atteignent jamais l'interpréteur. Tester de petits morceaux de code à la fois permet également d'isoler toute erreur qui passerait quand même.
print est-il une fonction ou une instruction en Python ?
En Python 3, c'est une fonction, vous devez donc l'appeler avec des parenthèses : print("text"). La forme sans parenthèses print "text" n'était valide qu'en Python 2 et est maintenant une erreur de syntaxe. Si vous voyez "Missing parentheses in call to print," vous lisez du code Python 2 dans un interpréteur Python 3.
Crawlez n'importe quel site à grande échelle, sans combattre l'infrastructure.
Crawlbase gère les proxies, les empreintes et les CAPTCHA afin que votre équipe livre des pipelines de données au lieu de maintenir la plomberie de crawl. 1 000 requêtes gratuites, sans carte requise.
