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 :
Message | Explication |
---|---|
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 |
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
2. Erreur de structure
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.