L'indentation en Python : quand l'espace fait le code

En Python, les espaces en début de ligne ne décorent pas le code : ils délimitent les blocs. Mal indenter ne le rend pas moins lisible, mais faux.
6 min de lecture
Believemy logo

Définition

Tout langage doit répondre à une question de base : comment sait-on où commence et où finit un groupe d'instructions ? La plupart y répondent par des marqueurs, accolades en C ou en JavaScript, mots-clés ailleurs. Comme ces marqueurs ne se lisent pas d'un coup d'œil, on décale en plus les lignes vers la droite pour que la structure se voie. Deux systèmes cohabitent donc, un pour la machine et un pour l'œil, et rien ne garantit qu'ils racontent la même chose.

Python supprime ce doublon : le décalage que vous voyez est celui que l'interpréteur lit. L'indentation, c'est ce décalage en début de ligne, et c'est lui qui délimite les blocs. Ailleurs il relève de la présentation et le compilateur l'ignore ; ici il fait partie de la syntaxe, au même titre qu'un point-virgule dans d'autres langages. Mal indenter ne rend pas le code moins joli : cela le rend faux.

Un exemple minuscule suffit à voir la mécanique. Regardez surtout la dernière ligne, la seule revenue contre la marge de gauche.

PYTHON
if solde > 0:
    print("Crédit disponible")      # dans le bloc du if
    envoyer_confirmation()          # dans le bloc du if, lui aussi
print("Fin du traitement")          # revenu à gauche : hors du if

Les deux lignes décalées appartiennent au if et ne s'exécutent que si la condition est vraie. La dernière, revenue à gauche, s'exécute dans tous les cas. Aucun mot-clé ne vient refermer le bloc : le retour à la marge est le seul signal de fin.

Vient alors la question qui compte : que se passe-t-il si l'on se trompe d'un cran ? Déplacez envoyer_confirmation contre la marge, et le fichier reste parfaitement valide. Python ne signale rien, le programme tourne, et la confirmation part désormais y compris pour les comptes à découvert. Tout le danger est là : un décalage fautif ne provoque pas de plantage, il change le sens du programme.


Quatre espaces, et pas une tabulation

Le langage n'impose aucune largeur : il exige seulement que le décalage reste régulier à l'intérieur d'un même bloc. Trois espaces fonctionnent, huit aussi, une tabulation également, tant que vous ne changez pas d'avis en cours de route.

La convention, elle, est bien plus stricte, et c'est la PEP 8 qui la pose : quatre espaces par niveau, jamais de tabulation. Ce n'est pas une coquetterie. Le code Python circule entre des éditeurs, des terminaux, des interfaces web et des messageries qui n'affichent pas une tabulation de la même largeur, alors qu'un espace vaut un espace partout. Réglez donc votre éditeur pour qu'il transforme la touche de tabulation en quatre espaces : c'est le premier paramètre à vérifier en arrivant sur un projet Python.

Attention

Mélanger espaces et tabulations est l'erreur la plus vicieuse du langage, parce qu'elle est invisible. Deux lignes peuvent paraître alignées au pixel près alors que l'une commence par une tabulation et l'autre par quatre espaces. Python refuse le fichier avec une TabError, et l'œil ne voit rien à corriger. Réindentez la zone entière plutôt que de chercher le caractère fautif.


Tout ce qui ouvre un bloc

Une fois le principe admis, la grammaire tient dans une observation : une ligne qui se termine par deux-points annonce un bloc, indenté juste en dessous. Les deux-points ouvrent, l'indentation porte le contenu, le retour à la marge referme.

Voici les structures concernées, avec ce que leur bloc contient à chaque fois.

StructureCe qu'elle contient
if, elif, elseLe code soumis à la condition
for, whileLe corps de la boucle
def, classLe corps de la fonction ou de la classe
try, except, finallyLe code surveillé et le rattrapage
withLe code qui s'exécute dans le contexte

Un bloc ne peut jamais rester vide. Si le corps d'une fonction n'est pas encore écrit, l'instruction pass tient la place et rend le fichier valide. Un commentaire ne ferait pas l'affaire : Python attend une instruction à cet endroit, et un commentaire n'en est pas une.

Bon à savoir

La régularité exigée s'arrête aux frontières d'un bloc. Un fichier indenté à deux espaces et un autre à quatre cohabitent sans un mot de reproche dans le même projet : c'est la relecture par un humain qui en souffre, pas l'interpréteur. Un formateur comme black règle la question en réécrivant tout le projet à la même largeur.


Ce que la contrainte vous fait gagner

Cette obligation passe pour une bizarrerie quand on arrive d'un autre langage, et elle rend pourtant deux services qui ne se mesurent qu'à l'usage. Le premier : tout le code Python du monde se ressemble. Pas de débat sur la position des accolades, pas de style maison à absorber en arrivant sur un projet, pas de fichier de configuration à négocier en équipe.

Le second se voit à l'œil nu, puisque la complexité d'un code y prend une forme. Une fonction dont le corps part sur cinq niveaux d'imbrication dessine un escalier qui s'éloigne de la marge, et ce dessin annonce le problème avant qu'on ait lu une seule ligne. Ici, la structure d'un programme et son apparence ne peuvent plus diverger, ce qui fait de l'indentation un outil de relecture autant qu'une règle de syntaxe.


Questions fréquentes

Question

Combien d'espaces faut-il utiliser ?

Quatre par niveau, c'est la convention universelle de la PEP 8. Deux ou huit fonctionnent techniquement, mais aucun projet sérieux ne s'en écarte, et tous les outils de formatage automatique appliquent quatre sans poser la question. Un seul cas justifie de s'aligner autrement : reprendre du code existant, où mieux vaut suivre la largeur déjà en place que mélanger deux conventions.

Question

D'où vient l'erreur « unexpected indent » ?

D'une ligne décalée alors qu'aucune ligne au-dessus n'a ouvert de bloc, le plus souvent après un copier-coller entre deux fichiers. Python lève une IndentationError et donne le numéro de ligne exact ; la correction consiste presque toujours à ramener la ligne signalée au niveau de celle qui la précède. Son inverse, « expected an indented block », signale une ligne terminée par deux-points sans rien en dessous.

Question

Peut-on tout écrire sur une seule ligne pour éviter l'indentation ?

Le langage l'autorise pour un bloc d'une seule instruction, par exemple if x: return 0, mais la lisibilité en souffre dès que la ligne s'allonge, et les outils de formatage la réécrivent sur deux lignes. Cette écriture est à réserver aux cas les plus courts. Prendre les bons réflexes de mise en forme dès les premiers programmes évite d'avoir à les désapprendre plus tard, et c'est par là que commence notre formation Python.

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.