Adloun

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.