Python et l'indentation : évitez ces 3 erreurs courantes

La syntaxe de Python tourne principalement autour des indentations. Découvre dans cet article les 3 erreurs les plus courantes et comment y remédier.

Publié le par Thibault Houdon (mis à jour le )
paceTemps de lecture estimé : 13 minutes

La syntaxe de Python tourne principalement autour des indentations. Découvre dans cet article les 3 erreurs les plus courantes et comment y remédier.

On est bien content avec Python de ne pas avoir à s'embêter avec des accolades dans tous les sens pour délimiter des blocs d'instruction.

Le désavantage (puisqu'il en faut bien un) c'est de se retrouver dans certains cas de figure avec des erreurs d'indentation.

Dans cet article, on va voir les 3 erreurs les plus fréquentes concernant l'indentation :

  1. IndentationError: expected an indented block
  2. IndentationError: unindent does not match any outer indentation level
  3. TabError: inconsistent use of tabs and spaces in indentation

Cependant je tiens à vous rassurer, il est très facile d'en venir à bout et c'est définitivement le genre d'erreurs que vous ne ferez qu'au début.

IndentationError: expected an indented block

Avec Python, vous devez absolument mettre du code à l'intérieur d'un bloc d'instruction.

Un bloc d'instruction est automatiquement nécessaire dès lors qu'une ligne de code se termine par le symbole deux points.Un bloc d'instruction et l'indentation permet de définir la notion d'appartenance d'une ligne de code à une autre.

On retrouve donc les blocs d'instructions dans les boucles, les structures conditionnelles, les fonctions, les classes etc.

Avec Python, vous êtes obligé de mettre au moins une instruction dans un bloc d'instruction.Le code suivant vous retournera donc l'erreur expected an indented block :

def main():
    for _ in range(5):

    return True

>>> IndentationError: expected an indented block

Si vous ne savez pas encore ce que vous souhaitez mettre à l'intérieur de votre bloc d'instruction, vous pouvez mettre l'instruction pass, qui a comme effet... de ne rien faire (mais au moins le script ne plantera pas) :

def main():
    for _ in range(5):
        pass

    return True

☝️ Un Python heureux 🐍

IndentationError: unindent does not match any outer indentation level

Cette erreur arrive dans le cas où vos niveaux d'indentation ne sont pas tous alignés.

Cela arrive majoritairement aux gens qui s'obstinent à utilisent 4 espaces au lieu d'une tabulation.

Il arrive en effet qu'on manque un espace et qu'on se retrouve donc avec certaines indentations qui contiennent 4 espaces et d'autres 3 ou 5 comme ici :

def main():
    for _ in range(5):
        print("Docstring")
       print("c'est génial")

if __name__ == "__main__":
    main()

Vous voyez que les deux print ne sont pas correctement alignés.

Si vous lancez ce script, vous aurez l'erreur unindent does not match any outer indentation level car la ligne print("c'est génial") ne correspond à aucun niveau d'indentation du script.

En effet, dans ce script vous avez plusieurs blocs d'instruction :

  • L'espace global qui contient la définition de la fonction main et la structure conditionnelle.
  • L'espace de la fonction main qui contient la boucle for.
  • L'espace de la boucle for qui contient le premier print.

Le deuxième print n'appartient à aucun de ces blocs d'instruction que Python a identifié et provoque donc une erreur.

Il faudra donc choisir le niveau d'indentation que vous souhaitez lui attribuer :

  • Aucune indentation : le print sera donc dans l'espace global.
def main():
    for _ in range(5):
        print("Docstring")

print("c'est génial")

if __name__ == "__main__":
    main()
  • Un niveau d'indentation : le print sera dans la fonction main.
def main():
    for _ in range(5):
        print("Docstring")

    print("c'est génial")

if __name__ == "__main__":
    main()
  • Deux niveaux d'indentation : le print sera à l'intérieur de la boucle for.
def main():
    for _ in range(5):
        print("Docstring")
        print("c'est génial")

if __name__ == "__main__":
    main()

Attention également de ne pas aller trop loin dans l'autre sens !

Si vous ajoutez un niveau d'indentation supplémentaire, vous aurez là encore une erreur d'indentation (cette fois-ci IndentationError : unexpected indent) :

def main():
    for _ in range(5):
        print("Docstring")
            print("c'est génial")

if __name__ == "__main__":
    main()

TabError: inconsistent use of tabs and spaces in indentation

Cette erreur est celle que je vois le plus souvent parmi les débutants car c'est celle qui est la plus difficile à identifier.

À première vue, ce code semble tout à fait valide.

Les indentations sont correctes, il ne manque pas de deux points ou quoi que ce soit qui pourrait causer une erreur.

Avec PyCharm

Allez dans Edit > Convert Indents > To Spaces

Avec Sublime Text

Allez dans View > Indentation > Convert Indentations to Spaces

Vous avez donc maintenant toutes les clés en main pour résoudre ces trois erreurs que l'on retrouve très souvent avec Python.

La grande force de Python c'est ça syntaxe, et il fallait bien que cela vienne avec quelques inconvénients.

Mais vraiment, si vous portez attention à ces quelques erreurs et ne passez pas votre temps à passer des espaces aux tabulations, vous ne devriez plus jamais avoir ces problèmes.