10 - Debuggage à l'aide des messages erreurs⚓︎
Erreurs de syntaxe⚓︎
\(\bullet\) SyntaxError: invalid syntax. Perhaps you forgot a comma?
Cela signifie qu'il y a une erreur de syntaxe.
Le message erreur nous demande si on n'a pas oublié une virgule, mais cette supposition n'est pas forcément pertinente.
Vous pouvez avoir mal écrit les instructions, ou oublié les ":" ou les guillemets, ou une virgule.
De temps en temps, Python est bien pertinent dans l'identification du problème. Comme pour :
x = 4
if x = 2:
print("bravo")
File "<input>", line 1
if x = 2:
^^^^^
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
\(\bullet\) IndentationError: unexpected indent
signifie qu'on a fait une erreur d'indentation.
for i in range(5):
print("hello", end=", ")
print("you")
File "<input>", line 3
print("you")
IndentationError: unexpected indent
\(\bullet\) SyntaxError: unexpected EOF while parsing
"EOF" signifie "End of File". Cela signifie que, de manière inattendue, Python est tombé sur une fin de programme lors de la phase de vérification de la syntaxe. Cela arrive par exemple lorsqu'on a laissé un début de structure sans finir de rédiger...
Dans la même idée, on peut retrouver des erreurs du genre : SyntaxError: incomplete input.
Erreurs de type⚓︎
Tous les TypeError correspondent à des erreurs de type :
cela veut dire que l'on a essayé d'appliquer une opération ou une méthode sur un type qui n'est pas prévu pour cela.
La suite du message indique quel type n'est pas applicable et quelle action on a tenté de faire.
Par exemple :
\(\bullet\) TypeError: can only concatenate str (not "int") to str
signifie qu'on a essayé de concatener une chaîne avec un entier (on a mis un "+" entre une variable un str et un int)
age = 14
print("j'ai "+age+" ans")
Traceback (most recent call last):
File "<input>", line 2, in <module>
TypeError: can only concatenate str (not "int") to str
\(\bullet\) TypeError: unsupported operand type(s) for -: 'str' and 'int'
signifie qu'on a tenté de faire une opération entre une chaîne et un entier (une addition, une soustraction, etc...)
somme = 0
somme += input("valeur ?")
Traceback (most recent call last):
File "<input>", line 2, in <module>
TypeError: unsupported operand type(s) for +=: 'int' and 'str'
\(\bullet\) TypeError: 'int' object is not iterable
signifie qu'on a essayé d'itérer (comme on parcourt une liste) sur un objet de type entier.
Typiquement, on a écrit for i in len(liste) au lieu d'écrire for i in range(len(liste)).
L = [1, 2, 3, 4, 5]
for i in range(L):
print(L[i])
Traceback (most recent call last):
File "<input>", line 2, in <module>
TypeError: 'list' object cannot be interpreted as an integer
\(\bullet\) TypeError: 'str' object is not callable
signifie qu'on a essayé d'appeler (comme on "appelle" une fonction) une variable qui était en fait une chaîne de caractères (str). En pratique, on a mis des parenthèses derrière le nom d'une variable de type str.
texte = "bonjour"
for i in range(len(texte)):
print(texte(i))
Traceback (most recent call last):
File "<input>", line 3, in <module>
TypeError: 'str' object is not callable
\(\bullet\) TypeError: list indices must be integers or slices, not str
signifie qu'on a essayé d'utiliser une chaîne de caractères à la place d'un nombre comme indice d'une suite.
On s'est donc trompé soit sur le type de ce qu'on a utlisé comme indice, soit sur le type de la liste (qu'on a confondue avec un dictionnaire).
L = ['a', 'b', 'c', 'd', 'e', 'f']
nb = input("indice de la liste ?")
print(L[nb])
Traceback (most recent call last):
File "<input>", line 3, in <module>
TypeError: list indices must be integers or slices, not str
\(\bullet\) TypeError: unhashable type: 'dict'
Ce qui est hashable peut être utilisé comme clé d'un dictionnaire, c'est à dire tous les types immuables. Ici, on a essayé d'utiliser un type mutable (un dictionnaire) comme clé d'un autre dictionnaire, ce n'est pas possible.
\(\bullet\) TypeError: 'builtin_function_or_method' object is not subscriptable
signifie qu'on a essayé d'accéder à un élément d'un objet (comme pour une liste ou un dictionnaire) mais sur un objet fonction.
Concrètement, on a mis des crochets derrière le nom d'une fonction.
def ma_fonction(x):
return 3*x + 1
print(ma_fonction[3])
Traceback (most recent call last):
File "<input>", line 4, in <module>
TypeError: 'function' object is not subscriptable
Remarque : Une fonction est callable (on peut l'appeler), une liste est iterable (on peut la parcourir avec un for), une liste et un dictionnaire sont subscriptable (on peut accéder à l'un de leur élément avec un indice ou une clé entre crochets), seuls les types immuables sont hashable.
Erreurs diverses⚓︎
\(\bullet\) AttributeError: 'list' object has no attribute 'len'
correspond généralement à une erreur de type, mais peut aussi correspondre à une erreur de syntaxe.
On a essayé d'appliquer une méthode (ou de récupérer un attribut) sur un objet pour lequel cette méthode n'existe pas. Cette méthode ou cet attribut a été noté après un point (.) derrière l'objet de type non adapté.
L = [1, 2, 3]
print(L.len())
Traceback (most recent call last):
File "<input>", line 2, in <module>
AttributeError: 'list' object has no attribute 'len'
\(\bullet\) IndexError: string index out of range
signifie qu'on a mis un indice trop grand dans les crochets d'une chaine de caractères (on pourrait avoir le même message mais pour une liste). Par exemple, il faut se souvenir que les indices d'une liste ou d'une chaîne vont de 0 à len(liste)-1, donc il ne faut pas essayer de récupérer la valeur d'indice len(liste).
L = [1, 2, 3, 4, 5, 6]
ind = 0
while ind <= len(L):
print(L[ind])
ind += 1
1
2
3
4
5
6
Traceback (most recent call last):
File "<input>", line 4, in <module>
IndexError: list index out of range
\(\bullet\) KeyError: 'Avengers'
signifie qu'on a voulu récupérer une valeur dans un dictionnaire avec une clé qui n'est pas présente dans le dictionnaire.
Si l'on n'est pas certain que la clé est présente dans le dictionnaire, on peut éviter un message erreur en testant d'abord la présence de la clé dans le dictionnaire (if 'Avengers' in dictionnaire:...), ou alors avec la méthode .get(clé) : dictionnaire.get('Avengers') renverra la valeur si la clé 'Avengers' est dans le dictionnaire, et None sinon.
\(\bullet\) ValueError: too many values to unpack (expected 2)
signifie que l'on a mis une affectation du type variable1, variable2 = .... Python doit récupérer 2 valeurs pour les affecter aux deux variables.
S'il y a "too many values to unpack" c'est qu'il ne récupère qu'une seule valeur, et qu'il ne peut donc pas la répartir entre les deux variables.
Il faut vérifier l'expression de droite qui ne renvoie pas deux valeurs comme attendu.
\(\bullet\) ZeroDivisionError: integer division or modulo by zero
signifie, comme son nom l'indique, qu'on a essayé de faire une division par zéro.
\(\bullet\) UnboundLocalError: local variable 'var1' referenced before assignment
signifie qu'on a essayé d'utiliser la valeur de la variable alors qu'on ne l'avait pas initialisée.
\(\bullet\) NameError: name 'var2' is not defined
signifie qu'on a fait appel à la valeur d'une variable qui n'était pas encore définie.
Il est possible qu'on ait oublié de l'initialiser. Ou alors, on souhaitait utiliser une chaîne de caractères mais on a oublié les guillemets.
for i in range(10):
somme += int(input())
print(somme)
Traceback (most recent call last):
File "<input>", line 2, in <module>
NameError: name 'somme' is not defined
print(bonjour)
Traceback (most recent call last):
File "<input>", line 1, in <module>
NameError: name 'bonjour' is not defined
\(\bullet\) ModuleNotFoundError: No module named 'Math'
signifie que le module qu'on a voulu importer n'existe pas sur l'ordinateur. Soit on s'est trompé de nom de module, soit il n'est pas encore installé.
\(\bullet\) ImportError: cannot import name 'srt' from 'math' (unknown location)
signifie que le module a bien été trouvé, mais que l'import de fonction s'est mal passé. Il est possible que se soit trompé de module (la fonction est dans un autre), ou qu'on se soit trompé dans le nom de la fonction.
help(nom du module entre guillemets)permet de retrouve la liste des fonctions de la bibliothèque.
\(\bullet\) FileNotFoundError: [Errno 44] No such file or directory: 'monfichier.txt'
signifie que le fichier demandé n'a pas été trouvé au chemin donné.
Peut-être vous êtes-vous trompé de chemin. Peut-être souhaitiez-vous créer le fichier (ouvrir en mode "w") et vous avez écrit mode "r" ?...