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 :
IndentationError
: expected an indented blockIndentationError
: unindent does not match any outer indentation levelTabError
: 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 fonctionmain
.
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 bouclefor
.
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.
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
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.