Mathématice, intégration des Tice dans l'enseignement des mathématiques  
Sommaire > N°69 - Mars 2020 > Comment comprendre et corriger les erreurs en (...)

Comment comprendre et corriger les erreurs en langage Python ?

Moteur de recherche
Mis en ligne le 20 février 2020, par Cyrille Guieu

Cet article propose une méthode pour comprendre les erreurs et plus généralement les comportements inattendus dans la programmation en langage Python. De nombreux exemples issus de situations d’enseignement sont présentés et analysés. L’objectif est d’aider les enseignants de lycée à être efficace en situation d’enseignement en salle informatique.

Introduction : une méthode pour agir

L’interprétation et le traitement des erreurs générées par un langage de programmation sont des compétences fondamentales pour apprendre la programmation. Il s’agit en effet d’une forme d’interaction avec le langage qui permet d’en comprendre la structure et les normes. L’objectif est d’apprendre aux élèves à réagir aux erreurs générées par l’interpréteur de façon efficace.

Un problème difficile

Pour modéliser cette situation (en la simplifiant légèrement) on pourrait se demander s’il existe un programme capable de déterminer si n’importe quel programme se termine ou pas. Alan Turing a montré en 1936 qu’un tel programme n’existe pas. Il est par conséquent illusoire d’obtenir une réponse algorithmique à la question posée. C’est donc une approche empirique basée sur des situations d’apprentissage réelles impliquant des lycéens, des étudiants de master MEEF et des enseignants en formation continue qui est proposée.

Une méthode basée sur trois principes

Les trois principes proposés sont conçus pour s’appliquer successivement. En effet on ne sait pas à l’avance la profondeur de l’analyse qu’il faudra mobiliser pour comprendre le problème.

Principe 1 : les messages d’erreur se lisent de bas en haut

En effet la dernière ligne indique le type d’erreur et l’avant dernière donne l’instruction qui a généré l’erreur : ce sont les deux informations les plus importantes. Le reste du message décrit la "pile" des appels ayant généré l’erreur.

Exemple :

MessageExplication
ZeroDivisionError : division by zero L’erreur est liée à une tentative de division par zéro.
print("1/x="+str(1/x)) C’est la ligne qui a généré cette erreur
File "C :/Users/pret bureautique/Documents/MEGAsync/Rentrée2017/Formation/Algo Lycée/session 2/Erreurs/exemple1.py", line 4, in test Cette ligne était la ligne numéro 4 du fichier "exemple1.py". Elle est située dans le corps de la fonction "test".
File "< pyshell#0>", line 1, in test() Cette fonction a été appelée par un "fichier" qui est en fait ici une console "pyshell".

Principe 2 : il faut connaître les principaux messages d’erreur

1. Erreurs liées à une seule instruction

Erreurs de nom

L’interpréteur doit faire quelque chose avec un objet qui n’a pas été défini.

Ces deux erreurs se rencontrent très fréquemment en début d’apprentissage. Elles peuvent se comprendre par le fait que dans les usages quotidiens de la langue un changement de casse n’empêche pas de comprendre le sens d’un texte. C’est un choix arbitraire propre au langage Python. Voici un exemple d’un autre langage [1] qui ne distingue pas les majuscules des minuscules :

Un autre exemple du même genre :

Ici il s’agit d’une erreur sur le nom du module qui contient les fonctions mathématiques, on peut la corriger ainsi :

Saurez-vous deviner l’origine du message d’erreur suivant ?

Cette erreur est plus subtile : le programme (à gauche sur la figure) n’a pas été exécuté. De ce fait la fonction « f » n’a pas été définie.

Opérations mathématiques impossibles

Une variable prend une valeur qui n’est pas dans l’ensemble de définition de la fonction appelée.

Opérations mal construites

Il manque des éléments ou des éléments ne sont pas du bon type pour appliquer une fonction.

Cette erreur classique vient du fait que les index commencent à 0 dans les listes.

En langage Python on distingue l’affectation (« = ») et la comparaison (« == »).

Cette erreur vient du fait que l’expression 2n**3 n’a pas de sens. Il aurait fallu écrire 2*n**3.

Erreurs de type


L’opération « + » peut avoir plusieurs sens, elle peut en particulier se référer à l’addition des nombres ou à la concaténation des chaînes de caractères :

Ainsi l’expression proposée dans l’exemple est ambiguë : on ne peut pas savoir de quelle opération il s’agit.

Le fait qu’il manque un argument dans l’appel de la fonction « f » est assimilé à une erreur de type.

2. Erreur de structure

Erreurs d’indentation

L’interpréteur ne comprend pas dans quelle séquence doit être mise une ligne du code.

Dans cet exemple l’interpréteur ne peut pas savoir si l’instruction « print(x) » est dans la boucle ou pas.

Cette erreur est assez sournoise : il y un espace entre les chevrons (>>>) et l’expression « double(x) ».

L’interpréteur attend une nouvelle séquence à la suite des « : ».

Erreur de parenthèses


Une parenthèse fermée ne correspond à aucune parenthèse ouverte.

Dans les exemples ci-dessus, une parenthèse ouverte n’a pas été fermée.

Principe 3 : ce n’est pas forcément la ligne qui a généré le message d’erreur qu’il faut corriger pour que le programme fonctionne correctement.

Une erreur peut révéler une faiblesse dans la conception du programme ou un algorithme qui est lui-même erroné.

Dans l’exemple ci-dessus, la variable « u » n’a pas été affectée d’une valeur. Le contexte suggère un oubli de l’instruction « u=0 » avant l’exécution de la boucle.

Au-delà des messages d’erreur : comprendre les comportements inattendus

Pour réussir ce genre de tâche, il convient d’admettre que le comportement de l’interpréteur Python est correct. Il faut donc essayer de détailler ce qu’il a généré comme sorties (dont les messages d’erreur) indépendamment du but recherché.
Les élèves (et les enseignants !) sont souvent confrontés à des programmes qui n’engendrent pas de message d’erreur mais qui ne sont pas les comportement attendus. Dans l’exemple ci-dessous la réponse attendue était : [4,3,2,1]

Le problème vient du fait que la boucle n’est jamais exécutée car la variable « i » prend la valeur -1 avant la boucle.

Conclusion

Ces quelques exemples ne sont bien sûrs pas exhaustifs et la méthode proposée peut se révéler inopérante dans certaines situations. Nous pensons néanmoins que les exemples présentés sont un bon point de départ pour se préparer à aider des élèves en salle informatique qui programment en Python.
On pourrait cependant douter de l’intérêt pédagogique de cette gymnastique intellectuelle spécifique. Une approche constructive serait de considérer ce travail d’enquête comme une forme de résolution de problème dont les heuristiques peuvent se rapprocher de démarches plus classiques en mathématiques. Enfin cet exemple de formalisme souvent très proche du formalisme mathématique permet de construire des situations où l’enseignant n’est plus le seul garant du respect des règles formelles d’écriture.


notes

[1Il s’agit du langage PowerShell du système d’exploitation Windows

Réagir à cet article
Vous souhaitez compléter cet article pour un numéro futur, réagir à son contenu, demander des précisions à l'auteur ou au comité de rédaction...
À lire aussi ici
MathémaTICE est un projet
en collaboration avec
Suivre la vie du site Flux RSS 2.0  |  Espace de rédaction  |  Nous contacter  |  Site réalisé avec: SPIP  |  N° ISSN 2109-9197