Le convertir du cours travaille sur place
Exercice d'entraînement · niveau 2 · NSI (première), chapitre 6 — Traiter des données en tables · Importer, convertir, contrôler
Énoncé
Le convertir du cours travaille sur place. Que devient la table si la conversion échoue au milieu ? Écrire une version « tout ou rien », et comparer les deux états.
Corrigé
L'état après échec. Sur la colonne ['1', '2', 'trois', '4'], convertir(t, "x", int) lève une ValueError au troisième élément, mais les deux premiers ont déjà été écrits :
[1, 2, 'trois', '4'] <- deux entiers, deux chaines : table INCOHERENTE
La table est maintenant hétérogène — la colonne mélange int et str — et le programme qui rattrape l'exception n'a aucun moyen de savoir jusqu'où la conversion était allée.
La version tout ou rien. On construit d'abord tout le résultat ; on ne touche à la table qu'une fois qu'on est sûr que rien n'échouera.
def convertir_tout_ou_rien(table, colonne, fonction):
"""Convertit une colonne, ou ne change rien du tout.
Postcondition : si une exception est levée, la table est exactement
dans son état initial.
"""
neuve = []
for ligne in table:
c = dict(ligne)
c[colonne] = fonction(ligne[colonne]) # peut lever ici
neuve.append(c)
for ligne, c in zip(table, neuve): # ne s'exécute que si tout a réussi
ligne[colonne] = c[colonne]
Après échec : ['1', '2', 'trois', '4'] — la table est intacte.
Le principe. Une opération sur une table doit réussir entièrement ou ne rien faire. C'est ce que les bases de données de terminale appelleront une transaction ; la même idée, à l'échelle d'une fonction de dix lignes, se programme avec une liste temporaire.
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.