Adloun

Les données EXIF d'une photo forment un enregistrement

Exercice de TD · niveau 2 · NSI (première), chapitre 5 — Les dictionnaires · Les usages : enregistrement, comptage, index

Énoncé

Les données EXIF d'une photo forment un enregistrement. Écrire champs_manquants(photo) et resume(photo). Puis provoquer une faute de frappe dans un nom de champ, et montrer que len ne la détecte pas.

Corrigé


DESCRIPTEURS = ["largeur", "hauteur", "iso", "date", "appareil"]

def champs_manquants(photo, descripteurs=DESCRIPTEURS):
    """Liste des descripteurs attendus qui manquent dans photo."""
    return [d for d in descripteurs if d not in photo]


def resume(photo):
    """Ligne de resume ; refuse une photo incomplete."""
    manquants = champs_manquants(photo)
    assert manquants == [], "champs manquants : " + ", ".join(manquants)
    return "%dx%d, ISO %d, %s, le %s" % (photo["largeur"], photo["hauteur"],
                                         photo["iso"], photo["appareil"],
                                         photo["date"])

La faute de frappe, et pourquoi elle est indétectable au compte.


photo = {"largeur": 4032, "hauteur": 3024, "iso": 200,
         "date": "2026-08-07", "appareil": "Pixel"}
fautive = dict(photo)
del fautive["iso"]
fautive["is0"] = 200            # is-zero : AUCUNE erreur a l'ecriture

assert len(fautive) == 5                       # le compte est bon...
assert champs_manquants(fautive) == ["iso"]    # ... et pourtant il manque un champ

C'est l'avertissement du cours pris sur le fait : « la même syntaxe crée et modifie ». L'écriture d'une clé mal orthographiée ne provoque rien — elle ajoute une entrée. Le dictionnaire a toujours cinq clés, la fonction resume lèverait KeyError bien plus loin dans le programme, et sur une autre ligne que celle de la faute. Seule la comparaison à une liste de descripteurs attendus détecte l'erreur, et elle la détecte au bon endroit.

Le message d'erreur porte l'information. assert manquants == [] suffirait à refuser la photo, mais l'utilisateur ne saurait pas quoi corriger. En joignant les noms manquants au message, l'échec devient utilisable : champs manquants : iso, date.

Vérification.


assert champs_manquants(photo) == []
assert resume(photo) == "4032x3024, ISO 200, Pixel, le 2026-08-07"

incomplete = {"largeur": 4032, "hauteur": 3024, "appareil": "Pixel"}
assert champs_manquants(incomplete) == ["iso", "date"]

L'ordre de la liste rendue est celui de DESCRIPTEURS, pas celui du dictionnaire : c'est la liste de référence qu'on parcourt, et c'est ce qui rend le résultat reproductible.

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.