Adloun

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.

VersionCode qui se casseComment
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, {&quot;nom&quot;: &quot;Nour&quot;, &quot;age&quot;: 17, &quot;moyenne&quot;: 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.