Mon Labo Python

Mes astuces pour comprendre enfin les erreurs d'indentation en Python

Mes astuces pour comprendre enfin les erreurs d'indentation en Python

Quatre espaces. Pas trois, pas cinq : c'est parfois toute la différence entre un script qui tourne et une IndentationError qui gâche la soirée. Débutante et autodidacte, j'apprends le Python entre deux tâches du quotidien, et cette histoire d'espaces invisibles revient sans cesse dans les questions qu'on me pose sur les erreurs Python les plus courantes. On me demande presque toujours la même chose : pourquoi le code a l'air identique à l'écran, et pourquoi la machine s'obstine quand même à dire non. Ce texte répond à ces questions une par une plutôt que de raconter une soirée précise — un code propre n'étant jamais aussi simple qu'il n'y paraît au début, surtout pour qui apprend en autonome.

Pourquoi mon code a l'air identique mais Python refuse quand même de le lire ?

Nos yeux sont indulgents : deux lignes à peu près alignées nous semblent pareilles, et on referme le sujet. L'interpréteur, lui, ne pardonne rien. Là où d'autres langages utilisent des accolades pour dire qu'un bloc d'instructions va avec tel autre, Python se sert du vide devant chaque ligne pour structurer le texte — l'indentation n'est pas une question d'esthétique, c'est une instruction à part entière. Si une ligne n'est pas décalée exactement comme celle qui la précède dans le même bloc, l'interpréteur refuse d'avancer et renvoie une erreur.

Le repère le plus utile que j'ai trouvé est écrit noir sur blanc dans le PEP 8, le guide de style officiel du langage : quatre espaces par niveau de bloc, ni plus ni moins, et jamais une tabulation isolée. Ce n'est pas qu'une convention esthétique, respecter cette règle évite justement les ennuis dont je parle plus bas. C'est un peu ce que je racontais à propos des variables, dans comment débuter en Python quand on n'est pas développeur : on se concentre sur les grandes idées et les détails nous rattrapent au tournant.

Gros plan d'un écran affichant les espaces et tabulations invisibles d'un script Python mal indenté.

La frontière invisible entre espaces et tabulations

Un mélange des deux passe souvent inaperçu à l'œil nu, alors qu'il ne l'est jamais pour la machine. Pour l'ordinateur, un espace correspond au code ASCII 32 et une tabulation au code ASCII 9 : deux caractères totalement distincts, même si nos écrans les affichent tous les deux comme du vide. Depuis Python 3, mélanger les deux dans un même bloc déclenche directement une TabError, alors que le code peut sembler parfaitement aligné à l'écran. Activer l'affichage des caractères invisibles dans son éditeur change tout : les espaces deviennent de petits points, les tabulations de petites flèches, et ce qui ressemblait à du vide propre se révèle être un vrai désordre de caractères mal assortis.

Repérer une erreur d'indentation en Python sans perdre patience

Une copine qui part courir en trail dans la Chaîne des Puys presque tous les week-ends m'avait conseillé un manuel en anglais qu'elle jurait imparable pour ce genre de blocage. Trop technique pour mon niveau du moment, truffé d'un vocabulaire que je devais traduire avant même de comprendre l'explication : je l'ai refermé au bout de quelques pages et je ne l'ai jamais rouvert. Ce qui a fini par marcher est beaucoup plus terre-à-terre. Mon éditeur transforme maintenant chaque pression sur la touche Tab en quatre espaces automatiquement, l'affichage des points invisibles reste activé en permanence, et quand une erreur persiste malgré tout, je supprime tout le décalage au début de la ligne fautive pour recommencer proprement plutôt que de traquer la faute caractère après caractère.

Repérer le bon niveau de décalage dans un bloc de code ressemble, au fond, à choisir le bon cageot au marché du Brézet un samedi matin : tout se ressemble à distance, mais une fois qu'on sait ce qu'on cherche, la différence devient évidente.

Mains d'une débutante en Python corrigeant une erreur d'indentation sur son clavier.

La première fois que mon terminal a affiché exactement le texte attendu, sans une seule ligne rouge, il y a eu un silence complet, même mes pensées semblaient avoir arrêté de tourner. Le temps de comprendre ce qui s'était enfin aligné, l'anse de ma tasse était passée de froide à tiède sous mes doigts, sans que je m'en rende compte.

L'indentation n'est pas la seule chose qui m'a fait trébucher

Avant l'indentation, d'autres obstacles bien plus classiques m'ont ralentie. Comprendre pourquoi une boucle tournait sans jamais s'arrêter, décoder un message d'erreur qui ne veut rien dire au premier coup d'œil, écrire une petite fonction sans recopier trois fois le même bout de code, se perdre dans les index d'une liste, ou simplement réussir à installer Python correctement avant même d'avoir écrit la moindre instruction : chaque étape est arrivée avec son lot de blocages. Les dictionnaires m'ont donné du fil à retordre avec leurs clés et leurs valeurs, les chaînes de caractères m'ont fait douter plus d'une fois, et importer un module pour la première fois m'a semblé aussi opaque qu'ouvrir une boîte fermée. Les conditions if/else, la gestion des exceptions avec try/except, ou simplement demander une saisie à l'utilisateur avec input() : chaque nouveauté a mis un moment avant de devenir naturelle.

Est-ce qu'on finit par ne plus se tromper ?

Pas vraiment, non. Les erreurs continuent d'arriver, juste différemment. Le réflexe a changé : avant de réécrire un bloc entier, je vérifie d'abord si tout est bien en espaces, jamais en tabulations, et si chaque niveau respecte les mêmes quatre espaces que le précédent. Le message d'erreur donne presque toujours le numéro de la ligne fautive — ce n'est pas une punition, c'est une adresse. Traiter ce numéro comme un point de départ plutôt que comme un verdict change complètement la soirée.

Je ne comprends pas encore tout, loin de là, et certains messages d'erreur ressemblent toujours à une langue que je n'ai pas apprise. Mais je ne passe plus des heures à me demander si j'ai ajouté un espace de trop. Est-ce que ce sentiment de buter sur un détail minuscule, alors que le reste semblait acquis, vous est familier aussi ?

Articles connexes