Trois cafés, un total faux
Une cliente écrit au service client. Elle a commandé trois paquets de café à 8,50 €.
Son panier affiche 8,50 € au lieu de 25,50 €. Le ticket arrive sur votre bureau.
Vous pourriez changer des lignes au hasard. Une développeuse expérimentée fait autrement : elle vérifie une chose à la fois.
À la fin de cette leçon
Remarque
Je peux trouver un bug en vérifiant une chose à la fois.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Bug | une erreur dans le code qui donne un mauvais résultat | |
| Débogage | la recherche et la correction d'un bug | |
| Trace d'erreur | le message que Python affiche quand il s'arrête | Traceback |
| une ligne qui affiche une valeur pendant l'exécution | print("total :", total) | |
| Hypothèse | une idée sur la cause, que vous vérifiez | |
| Couper en deux | vérifier au milieu pour savoir quelle moitié est fautive |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Lisez l'erreur en commençant par la fin
Quand Python s'arrête, il affiche une trace d'erreur. Elle paraît longue, mais elle se lit simplement.
La dernière ligne donne le type d'erreur et la raison. Lisez-la en premier.
Juste au-dessus, vous trouvez le fichier et le numéro de la ligne où tout s'est arrêté. Allez directement à cette ligne.
Exemple : une trace d'erreur ligne à ligne
| Ce que Python affiche | Ce que cela veut dire |
|---|---|
| Traceback (most recent call last): | Début de la trace des appels |
| File "main.py", line 6, in <module> | La ligne qui a appelé la fonction |
| File "main.py", line 2, in prix_avec_remise | La ligne où tout s'est arrêté |
| TypeError: unsupported operand type(s) for //: 'str' and 'int' | La raison : on divise du texte. Lisez-la en premier. |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Essayez : provoquez l'erreur, puis corrigez-la
def prix_avec_remise(prix, remise):
return prix - prix * remise // 100
# Le prix arrive d'un formulaire web, donc sous forme de texte.
prix = "2400"
print(prix_avec_remise(prix, 10))
# Exécutez et lisez la dernière ligne de l'erreur.
# Puis corrigez : int("2400") transforme le texte en nombre.
Un print montre ce que contient une variable
Certains bugs ne provoquent aucune erreur. Le programme tourne, mais le résultat est faux.
Posez alors une hypothèse : « je pense que cette variable est fausse ». Ajoutez un print juste après le calcul pour voir sa valeur.
Comparez ce qui s'affiche avec ce que vous attendiez. Un écart vous montre où chercher.
Essayez : la paie de la semaine
def salaire_semaine(heures, taux):
# Taux horaire en centimes. Au-delà de 35 h, l'heure est payée 25 % de plus.
normales = heures
sup = heures - 35
if sup < 0:
sup = 0
print("normales :", normales, "sup :", sup)
return normales * taux + sup * taux * 125 // 100
# 38 heures à 12 € de l'heure : on attend 35 x 1200 + 3 x 1500 = 46500.
print(salaire_semaine(38, 1200))
# Lisez ce qu'affiche le print. Quelle valeur est fausse ?
# Corrigez le calcul de normales, puis exécutez de nouveau.
Coupez le problème en deux
Un programme fait souvent plusieurs étapes. Lire une commande, la nettoyer, calculer, afficher.
Si le résultat final est faux, ne regardez pas les quatre étapes au hasard. Vérifiez la valeur au milieu, après la deuxième étape.
Si elle est juste, le bug est dans la seconde moitié. Sinon, il est dans la première. Recommencez avec la moitié fautive.
Exemple : le panier de trois cafés
| Où vous vérifiez | Ce que vous voyez | Ce que vous en concluez |
|---|---|---|
| Après la lecture du panier | prix 850, quantite 3 | Les données sont justes |
| Au milieu, après le calcul | total = 850 | Faux : le bug est avant |
| Dans la boucle, ligne par ligne | total repart de 0 | Le bug est trouvé |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur fréquente
Attention
Beaucoup changent plusieurs lignes à la fois en espérant que cela marche. Si le bug disparaît, vous ne savez pas quelle ligne l'a corrigé. Si un autre apparaît, vous ne savez pas d'où il vient. Changez une seule chose, puis testez.