Reprendre le triplet ("Nour", 17, 15.5) et écrire la version en…
Exercice d'entraînement · niveau 2 · NSI (première), chapitre 4 — Les types construits · Enregistrements et p-uplets nommés
Énoncé
Reprendre le triplet ("Nour", 17, 15.5) et écrire la version en p-uplet nommé. Insérer ensuite un champ classe en deuxième position et dire quel code se casse silencieusement dans chacune des deux versions.
Corrigé
from collections import namedtuple
Eleve = namedtuple("Eleve", ["nom", "age", "moyenne"])
nour = Eleve("Nour", 17, 15.5)
nour.moyenne # 15.5
nour[2] # 15.5 : un p-uplet nomme reste un p-uplet
Après insertion du champ classe en deuxième position.
Eleve2 = namedtuple("Eleve2", ["nom", "classe", "age", "moyenne"])
nour2 = Eleve2("Nour", "1G3", 17, 15.5)
nour2.moyenne # 15.5 <- toujours juste
nour2[2] # 17 <- c'est l'AGE, desormais
Ce qui se casse, et comment.
| Version | Code qui se casse | Comment |
|---|---|---|
| triplet simple | `t[2]` | silencieusement : devient |
| p-uplet nommé | `e.moyenne` | pas du tout : il suit le champ |
| p-uplet nommé | `e[2]` | silencieusement, comme le triplet |
Le mot important est « silencieusement ». Aucune exception, aucun avertissement : un programme qui calculait des moyennes calcule maintenant des âges, et continue. Si l'on avait supprimé un champ au lieu d'en ajouter un, l'accès t[3] lèverait IndexError — une erreur bruyante, donc bien moins dangereuse. Les défauts qui ne se signalent pas coûtent infiniment plus cher que ceux qui plantent.
La règle qui en découle : dans un p-uplet nommé, on accède toujours par le nom. La possibilité d'écrire nour[2] existe pour la compatibilité, pas pour l'usage. Et la même donnée s'écrira, au chapitre 5, {"nom": "Nour", "age": 17, "moyenne": 15.5} — un dictionnaire, où l'accès par rang n'existe même pas.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.