Comprendre les messages d'erreur Python

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):
    return x*x
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 pas de 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))

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.


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 :
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 ####




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 :

n = 5
for i in n:
    print(i)
Solution :
n = 5
for i in range( n ):
    print(i)


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:

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,200,200,(255,255,255))
Ici l'image est de largeur 200 et le pixel le plus à droite a pour abscisse 199 (car la numérotation commence à 0).

Autre message d'Erreur

Contactez votre enseignant pour qu'il vous explique ce message d'erreur et qu'il complète cette page.


(Nicolas Bonichon, Université de Bordeaux)
Last modified: Wednesday, 22 May 2019, 12:07 PM