3 erreurs d'indentation (et comment y remédier)

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.

Image de profil de l'auteur
Thibault Houdon
Partager:

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.

Ces erreurs sont très fréquentes quand on commence à apprendre Python.

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.

🐍 #1. 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 🐍

🐍 #2. 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()

🐍 #3. 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.

Cette erreur n'est visible que si vous affichez les caractères invisibles dans votre éditeur de texte.

La façon la plus rapide d'afficher ces caractères est bien souvent de sélectionner votre code.

Exemple avec Visual Studio Code :

☝️ Vous voyez sur l'image ci-dessus que pour le deuxième print, on voit un caractère différent des points qui représentent les espaces.

Ce caractère indique que l'indentation a été effectuée avec une tabulation au lieu de 4 espaces.

Dans le plupart des éditeurs de code dignes de ce nom (comme PyCharm, Visual Studio Code, Sublime Text, Atom etc), peu importe que vous utilisiez les tabulations ou 4 espaces pour effectuer une indentation : en arrière-plan, même si vous utilisez la tabulation, les indentations seront transformées en 4 espace pour garder un code uniforme et éviter ces erreurs.

Cette erreur arrive souvent quand vous copiez du code d'un éditeur à un autre ou du code depuis internet.

Pas de panique si vous vous retrouvez avec cette erreur, la plupart des éditeurs disposent de fonctions pour uniformiser les indentations automatiquement.

Pas besoin donc de refaire à la main toutes vos indentations avec 4 espaces !

Avec Visual Studio Code

👉 Allez dans View > Command Palette (Cmd + Shift + P)

👉 Dans le panneau qui s'ouvre, cherchez la commande 'Convert Indentations to Spaces' et exécutez là.

Avec PyCharm

👉 Allez dans Edit > Convert Indents > To Spaces

Avec Sublime Text

👉 Allez dans View > Indentation > Convert Indentations to Spaces

🐍 Conclusion

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.

Et vous, vous êtes plutôt team espaces ou team tabulation ?

Abonne-toi à l'infolettre,

pour recevoir en exclusivité les prochains articles.

Articles populaires

Tout le monde les as lus, au moins deux fois !