Doc: Comprendre les messages d'erreur

Messages d'erreur

Viser sideversjon #4
(Gjenopprett denne versjonen) 

Modifisert: 20. October 2022, 17:52   Bruker: Samuel Thibault  → Bilde av Samuel Thibault

NameError: name 'blablaBla' is not defined

Erreur : le nom 'blablabla' n'est pas défini. Soit vous utilisez la variable (ou la fonction) blablabla avant de la définir soit vous vous êtes trompé en tapant le nom de la variable (ou de la fonction) blablabla. Attention Python est sensible à l'utilisation des majuscules. Il peut aussi arriver qu'on ait oublié des guillemets autour d'une chaîne de caractères (voir exemple 3):

Exemple  1:

def blablaBla(x):
a=2*x
  return x*a
y = blablabla(2)

NameError: name 'blablabla' is not defined

Ici nous avons mal orthographié 'blablabla' : il y un B majuscule dans le 3ième bla de la définition de la fonction et on a oublié la majuscule dans l'appel de la fonction.

Exemple  2:
j = 5
x = 2 * i
i = 4

NameError: name 'i' is not defined

Origine du problème : on utilise le nom 'i' dans cette expression alors qu'il n'a jamais été défini avant. Soit on aurait dû initialiser la variable 'i' avant (déplacer l'instruction i=4 avant l'instruction x  = 2 * i) soit on a mal orthographié la variable (on voulait taper 'j' au lieu de 'i').


Exemple un peu plus subtil :

def f(x):
m = x*x
return m

f(5)
y = m

NameError: name 'm' is not defined

Origine du problème : la variable 'm' est une variable locale à la fonction 'f', elle ne "vit" qu'à l'intérieur de la fonction 'f'.


Exemple 3 :

monImage = ouvrirImage(teapot.png)

Solution :

monImage = ouvrirImage("teapot.png")

Explication : comme on a oublié les guillemets, python pense que teapot est le nom d'une variable... qui n'est donc pas définie.

SyntaxError: invalid syntax

Erreur : erreur de syntaxe. Cela veut dire que l'interpréteur est un peu perdu car il n'arrive pas à déchiffrer votre programme. L'origine du problème n'est pas forcément à l'endroit pointé par l'interpréteur, comme nous allons le voir dans les exemples ci-dessous.

exemple 1 :

 def f(x)
^

SyntaxError: invalid syntax

Origine du problème : on a oublié les ':' à la fin de la ligne

solution :

def f(x):

exemple 2 :

if i = 6:
^
problème : après le if il s'attend à avoir une expression booléen. Ici il se retrouve avec une affectation, il est donc perdu.

solution : remplacer le symbole d'affectation par le symbole de test d'égalité
if i == 6:

exemple 3 :

 if i == 9
^

SyntaxError: invalid syntax

Origine du problème : on a oublié les ':' à la fin de la ligne

solution :
if i==9 :

exemple 4 :
def f(x):
    return sqrt((x*x - x)
print(f(5))
^
Origine du problème : il manque une parenthèse fermante la ligne au dessus

solution :
def f(x):
    return sqrt((x*x - x))
print(f(5))

exemple 5:

def f(x):
    return sqrt((x*x - x)

print f(5)
^
en Python 3 (contrairement à python 2) print est une fonction comme les autres. Donc pour appeler cette fonction il faut mettre des parenthèses.
Solution :
def f(x):
    return sqrt((x*x - x)

print (f(5))
^

Exemple 6 :
    if x<y:
        return y
    else y<x:
        return x

L'erreur est sur la ligne du else. En effet, soit on écrit else: (sans mettre de condition), soit on écrit elif avec une condition.

SyntaxError: expected an indented block

Erreur : problème d'indentation. Le plus fréquemment il manque une ou plusieurs tabulation à l'endroit pointé par le message d'erreur (voir exemple 1). Parfois, l'origine du problème vient de plus haut dans votre le fichier. Par exemple lorsqu'on a commencé une fonction, un if ou un for, que l'on n'a pas fait suivre par une instruction (voir exemple  2) ou qu'on a commenté l'instruction en question (exemple 3).


Exemple 1 :

if i == 9:
toto = 9

Solution 1 :

if i == 9 :
toto = 9

Exemple 2 : vous avez déclaré une fonction sans définir son code :

def f(x):


y = 5*2

Solution 2: rajouter un return dans votre fonction

def f(x):
return


y = 5*2

Exemple 3 : vous avez commenté qu'une partie du code :

for i in range(5):
## print(i)

y = 5*2

Solution 2: mettre


   
##for i in range(5):
## print(i)

y = 5*2


SyntaxError: unindent does not match any outer indentation level


if i == 9:
titi = 5
toto = 4
^
SyntaxError: unindent does not match any outer indentation level

Erreur: le niveau d'indentation (nombre de tabulation) ne correspond à aucun niveau d'indentation externe.

ici : l'instruction 'toto = 9' est soit trop à gauche soit trop à droite. Cela arrive souvent lorsqu'on mélange les tabulations et les 'espaces'.


Solution

if i == 9:
titi = 5
toto = 4

ou (selon le contexte)

if i == 9:
titi = 5
toto = 4


SyntaxError: unexpected indent

Problème: Il y a un niveau d'indentation de trop (il y a trop de tabulations sur cette ligne).


Exemple :

def f(x):
    y = x*x
    return y

Solution : supprimer les tabulations superflux

def f(x):
    y = x*x
    return y

SyntaxError: can't assign to operator


 i+1 = 5

^

SyntaxError: can't assign to operator


Erreur : on ne peut pas assigner une valeur à un opérateur (ici le symbole '+').

Origine du problème : à gauche du symbole '=' (symbole d'affectation) il ne peut y avoir qu'un nom de variable (déjà définie ou non).

Ici on voulait peut-être écrire i = 5 - 1


SyntaxError: can't assign to function call


def f(x):
return x*x

f(5) = y
^

SyntaxError: can't assign to function call

Erreur = on ne peut pas assigner une valeur à un appel de fonction.


Solution: Vous vouliez probablement écrire

def f(x):
return x*x

y = f(5)

SyntaxError: unexpected EOF while parsing

Problème : on arrive à la fin du fichier (EOF = End Of File) alors qu'on n'a pas terminé l'instruction ou le bloc d'instruction en cours

Exemple 1:
def f( n ):
s = 0
for i in range( n ):

### fin du fichier ####

Solution : compléter la fonction :
def f( n ):
s = 0
for i in range( n ):
s = s + i
return s
### fin du fichier ####

Exemple 2 :
print(pair(2), True)
print(pair(1),False
### fin du fichier ####
Solution : fermer toutes les parenthèses ouvertes.
print(pair(2), True)
print(pair(1),False)
### fin du fichier ####

SyntaxError: invalid character in identifier

Vous avez tapé un caractère non "standard" : exemple  "²"


IndentationError: unindent does not match any outer indentation level

Problème d'indentation (tabulation). Vous avez des niveaux de tabulations incohérents (le nombre tabulations/espaces).

def f(x):
    nb = 0
    for i in range(10):
       nb = nb +1
    return nb
Ici le return n'est ni au niveau du "nb = nb+1" ni au niveau du "for i in range(10):". Il faut choisir !!!

ValueError: math domain error

Exemple :
y = -5
x = sqrt( y )
Origine du problème : la fonction sqrt ne prend en paramètre que des nombres positifs.

TypeError: 'list' object cannot be interpreted as an integer

Problème : un objet de type "list" ne peut pas être interpréter comme un entier.
Exemple 1:
L=[5,2,3]
for i in range(L):

Ici on passe une liste en paramètre à la fonction range() alors qu'elle s'attend à avoir un entier.

Solution : ne pas utiliser la fonction range, mais directement la liste

L=[5,2,3]
for i in L:


TypeError: f() takes 2 positional arguments but 3 were given


Problème : la fonction 'f()' prend normalement 2 arguments et on l'appelle en lui en passant 3.
Exemple :
def f(x,y):
return x + y

print(f(5,6,7))

Solution : appeler la fonction avec le bon nombre d'arguments


TypeError: f() missing 1 required positional argument: 'y'

Problème: on appelle la fonction 'f()' en ne lui passant pas assez d'arguments

Exemple :

def f(x,y):
return x + y

print(f(5))

Solution : appeler la fonction avec le bon nombre d'arguments


TypeError: 'int' object is not iterable


Problème : l'interpréteur s'attend à avoir une liste, mais se retrouve avec un entier

Exemple 1:

n = 5
for i in n:
print(i)
Solution :
n = 5
for i in range( n ):
print(i)
Exemple 2:
L = nbSommets(G) ### L n'est pas une liste, mais juste un nombre !
for s in L:
     print(s)

Solution:
L = listeSommets(G)
for s in L:
    print(s)

TypeError: 'int' object is not callable

Problème : Vous utilisez une variable (ici de type entier) comme si c'était une fonction (c'est-à-dire en lui passant des arguments entre parenthèses).

Exemple 1:
def f(x):
return x*x

y = 2
z = y(5)
Solution : appeler la fonction f et non la variable y :
def f(x):
return x*x

y = 2
z = f(5)

Exemple 2:
monImage = nouvelleImage(300,200)
for y in range(largeurImage(monImage)):
    colorierPixel(monImage,0,y(255,255,255))
Solution : ici on a oublié une virgule :
monImage = nouvelleImage(300,200)
for y in range(largeurImage(monImage)):
    colorierPixel(monImage,0,y,(255,255,255))

TypeError: unorderable types: __c_node() <= int()

Problème : on essaye de comparer des choses incomparables. Par exemple sommet avec un nombre.

Exemple :
    c = 5
    for s in listeSommets(G):
        if s <= c:
Solution : ne pas utiliser le sommet s mais un entier (comme par exemple le degré de s) :
    c = 5
    for s in listeSommets(G):
        if degre(s) <= c:

TypeError: 'function' object is not subscriptable

Vous êtes en train de manipuler une fonction comme si c'était une liste (c'est à dire avec des crochets).
Exemple :
def moyenneListe(L):
     (...)
print(moyennesListe[2,6,3,5])

Solution ajouter des parenthèses autour des crochets :


               
print(moyennesListe([2,6,3,5]))

TypeError: unsupported operand type(s) for *: 'function' and 'function'

Python a l'impression que vous essayez de multiplier 2 fonctions entre elles. Il ne sait pas faire ça. Il ne sait multiplier que des nombres entre eux.

Exemple :
def f(x):
    return x *x
def g(y):
    return f*f

Solution :
def f(x):
    return x *x
def g(y):
    return f(y)*f(y)





IndexError: image index out of range

Problème : vous essayez d’accéder à un pixel qui n'est pas dans l'image.
Par exemple :
monImage = nouvelleImage(300,200)
colorierPixel(monImage,300,200,(255,255,255))
Ici l'image est de largeur 300 et le pixel autorisé le plus à droite a pour abscisse 299 (car la numérotation commence à 0).


ImportError: No module named 'bibimages'


from bibimages import *

Problème : python ne trouve pas le fichier bibimages.py. Il y a 2 causes principales à ce problème :

1) Soit vous avez mal tapé bibimages dans votre fichier.

2) Soit vous n'avez pas encore récupéré le fichier bibimages.py sur la page http://dept-info.labri.fr/ENSEIGNEMENT/INITINFO/initinfo/support.html

3) Soit vous l'avez bien récupéré, mais vous l'avez mis dans le mauvais autre répertoire.

4) Soit vous l'avez mis au bon endroit, mais vous l'avez appelé autrement que exactement bibimages.py (attention par défaut Window cache les extensions de nom de fichiers !)


FileNotFoundError: [Errno 2] No such file or directory: 'tgv2005.dot'

Le fichier 'tgv2005.dot' n'est pas présent dans le répertoire courant. Soit vous n'avez pas téléchargé ce fichier, soit vous l'avez téléchargé dans un autre répertoire. => Vérifiez le contenu du répertoire courant.

UnboundLocalError: local variable 'n' referenced before assignment

Vous utilisez une variable avant de l'avoir initialisée.


Autre message d'Erreur

python TypeError: 'NoneType' object does not support item assignment