Comment relire du code généré ?
Relire du code généré consiste à le lire, à le lancer et à lui poser des questions avant de l’accepter. Cette relecture s’appelle une revue de code.
Elle compte plus que jamais : un assistant écrit en dix secondes ce qu’une personne écrit en une heure. Vous devenez le relecteur, et la qualité dépend de votre attention.
À la fin de cette leçon
Remarque
Je peux relire un code que je n’ai pas écrit et repérer ses fautes avec une liste de questions.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Revue de code | la relecture d’un code avant de l’accepter | |
| Diff | l’affichage des lignes retirées et ajoutées par une modification | |
| Cas limite | une entrée extrême ou vide, où le code se trompe souvent | une liste vide |
| Exception | une erreur que Python signale quand une opération échoue | |
| Effet de bord | un changement fait ailleurs, comme écrire un fichier |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une revue a trois gestes : lire, lancer, questionner
Lire : comprenez chaque ligne, et demandez-vous si elle fait ce que vous avez demandé, et rien de plus. Lancer : exécutez le code et ses tests avec un exemple dont vous connaissez la réponse.
Questionner : que se passe-t-il si l’entrée est vide, très grande, ou fausse ? Que lit ou que modifie ce code, en dehors de son travail ?
Une liste de questions pour chaque relecture
| Question | Ce qu’elle trouve |
|---|---|
| Fait-il ce que j’ai demandé ? | Un code à côté du sujet |
| Fait-il autre chose en plus ? | Des changements que vous n’aviez pas demandés |
| Que fait-il avec une entrée vide ? | Une division par zéro |
| Que cache-t-il quand il échoue ? | Une erreur avalée en silence |
| Les fonctions et les options existent-elles ? | Des noms inventés |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Les fautes fréquentes d’un code généré
Un assistant écrit du code qui a l’air propre. Ses fautes sont discrètes. Il appelle parfois une fonction qui n’existe pas. Il avale les erreurs avec un except vide. Il utilise eval, qui exécute n’importe quel texte reçu.
Il peut aussi modifier un fichier que vous n’aviez pas cité. Cherchez ces fautes en premier.
Un code généré à relire
def lire_prix(texte):
# Transforme un texte comme "35" en nombre.
try:
return eval(texte)
except:
return 0
def moyenne(notes):
total = 0
for note in notes:
total = total + note
return total / len(notes)
print(lire_prix("35"))
print(moyenne([12, 8]))
Ce que la relecture trouve dans ce code
Dans lire_prix, eval exécute le texte : si quelqu’un tape une instruction, elle s’exécute. Et except vide renvoie 0 pour toute erreur, donc un prix illisible devient un prix gratuit.
Dans moyenne, une liste vide fait diviser par zéro. Chaque faute se trouve par une question de la liste.
Commencez par le plan du projet
Devant un projet inconnu, établissez d’abord son plan : quelles fonctions, quels tests. Les deux commandes suivantes lisent le projet de la boutique du laboratoire et ne modifient rien.
La première affiche les lignes où une fonction commence : 4, 12 et 16. La seconde compte les tests du fichier de tests : 5.
Lister les fonctions du programme
docker exec -w /home/node/project agent grep -n "function" shop.jsAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Compter les tests du projet
docker exec -w /home/node/project agent grep -c "^test(" shop.test.jsAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lisez le diff, pas seulement le résultat
Quand l’assistant modifie un fichier, un diff montre les lignes retirées (signe moins) et les lignes ajoutées (signe plus). Lisez toutes les lignes, pas seulement celle que vous attendiez.
Posez deux questions : cette ligne répond-elle à ma demande ? Y a-t-il des lignes en plus que je n’ai pas demandées ?
Un diff lu ligne par ligne
| Ligne du diff | Question à poser |
|---|---|
| - amende = 20 * jours | Pourquoi retire-t-on cette ligne ? |
| + amende = min(20 * jours, 600) | Est-ce bien le plafond demandé ? |
| + import os | Pourquoi un nouvel import ? |
| - assert amende(0) == 0 | Un test a été retiré : pourquoi ? |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Erreur fréquente
Attention
Beaucoup pensent qu’un code qui tourne sans erreur est correct. Il peut rendre un résultat faux sans rien signaler. Un test passe ou échoue, mais seule la relecture voit une erreur avalée ou un test supprimé.
Écrire un petit relecteur automatique
Dans le devoir, votre fonction lit les lignes d’un code et signale les fautes de la liste, numéro de ligne compris. Cinq règles, testées dans cet ordre : except: seul sur la ligne, eval(, == None, import *, TODO.
Chaque ligne donne au plus un signalement. Un relecteur humain fait mieux, mais cet outil attrape les fautes les plus courantes.