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.