Repérer les bugs : typages, effets de bords, débordements
- Fiche de cours
- Quiz
- Profs en ligne
- Videos
- Application mobile
- Repérer les problèmes de typage.
- Repérer les effets de bord.
- Repérer les problèmes de débordement de tableau.
- Les opérations classiques et les fonctions ne s’utilisent pas avec tous les types de valeurs ou de données.
- Les données de type mutable peuvent créer des effets de bord. Il faut être vigilant.
- Le parcours d’un tableau peut engendrer des problèmes de débordement.
- Connaitre les différents types de base. (1re)
- Prototyper une fonction en Python. (1re)
Un bug peut avoir deux conséquences principales : le programme ne peut pas être exécuté correctement, ou le programme s’exécute mais ne fait pas ce que l’on veut.
Bien programmer, c’est avant tout bien choisir le type des valeurs et des données utilisées et bien en connaitre les caractéristiques.
En Python, certaines opérations (+, -, /, *, etc.) s’utilisent avec différents types sans pour autant avoir la même signification.
En Python, l’opération « + » a une utilisation différente suivant les types de valeurs ou de données utilisées :
- + est l’addition mathématique pour les valeurs de type int, float.
- + est la concaténation (mise bout à bout) pour les données de types list, str, tuple.
En revanche, l’opérateur « - » s’utilise sur les valeurs de type int ou float, mais pas sur les données de types list, str, tuple.
Ce code génère une erreur
TypeError : unsupported operand type(s) for -.
Cela signifie explicitement (mais en anglais)
qu’il y a une erreur de typage dans
l’utilisation de
l’opérateur « - ».
Lorsqu’un code Python génère une erreur, un message d’erreur apparait. Pour le comprendre, il faut le lire de bas en haut.
- Repérer en dernière ligne du message quelle sorte d’erreur est générée (TypeError, ValueError, ZeroDivisionError, SyntaxError, NameError, etc.). Le nom de l’erreur est en anglais mais est souvent assez explicite.
- Lire la ligne à laquelle l’erreur est repérée. Attention, ce n’est peut-être pas la ligne où l’erreur se situe mais bien la ligne où Python bloque l’exécution du code.
Pour écrire la chaine de caractères "Python 3" à partir de "Python " et du nombre entier 3, il faut écrire le code "Python " + str(3). L’opération + est en effet ici la concaténation : il faut concaténer deux chaines de caractères, c’est pourquoi il faut transformer 3 en "3" avec la fonction str().
Le code "Python " + 3 génère une erreur de typage.
La fonction len() prend pour arguments des données de types list, str, tuple mais pas des entiers.
len("1234") renvoie 4 car "1234" est du type str.
En Python, cela se rencontre souvent avec les structures mutables comme les tableaux (de type list) ou les dictionnaires (de type dict).
La fonction func() suivante est à effet de bord.
Python | Explication |
tab = [1, 1, 2, 3, 5, 8, 13] | On définit le tableau tab. |
def func(): tab.append(tab[-1]+tab[-2]) |
On définit la fonction func() qui ajoute à la fin de tab la somme de ses deux derniers éléments. |
À chaque appel de func(), la variable tab est modifiée alors
qu’elle est extérieure au code qui
définit func(). Cela ne
génère pas d’erreur mais peut
entrainer des erreurs de conceptions plus globales
puisqu’il devient difficile de maitriser le
contenu de la variable tab.
On peut le voir ci-dessous sur Python Tutor.
Voici un code dont le but est d'affecter la chaine de caractères "Python 3" à la variable mot.
En Python, un tableau de taille n est indexé de 0 à n – 1.
Une erreur classique est de vouloir accéder à l’élément d’indice n, élément qui n’existe pas.
Cela génère une erreur IndexError : list index out of range.
On considère le tableau tab = [1, 2, 3, 4, 5].
Le tableau tab contient 5 éléments mais tab[5] n’existe pas.
Il est possible de modifier un tableau pendant son parcours et d’en modifier dynamiquement la taille. Cela peut créer un débordement de tableau. C’est pourquoi il est parfois nécessaire de créer un nouveau tableau plutôt que de modifier le tableau en plein parcours.
On considère le tableau tab = [1, 1, 2, 3, 5, 8, 13].
On souhaite retirer les éléments pairs de cette liste avec le code suivant.
Pour éviter cette erreur, il suffit de créer un second tableau.
En Python, il est important de connaitre le nom des erreurs rencontrées et leurs significations.
Nom d’erreur | Signification |
TypeError | Il y a un problème d’utilisation de variables à cause de leur type. |
UnboundLocalError | Une variable est utilisée dans une fonction, n’y est pas définie et, a priori, n’existe pas à l’extérieur de la fonction. |
IndexError | Il y a un problème de débordement. |
ZeroDivisionError | Un calcul contient une division par 0. |
SyntaxError | Il y a une erreur de syntaxe. |
IndentationError | Il y a une erreur d’utilisation des indentations. |
NameError | Un nom de variable est utilisé mais n’existe pas. |
Vous avez obtenu75%de bonnes réponses !