Aller au contenu principal
🔒 Mode aperçu. Les quinze premières leçons Foundations sont gratuites ; celle-ci est Pro. Démarrez un trial de 7 jours pour débloquer l'éditeur, les conseils AI et le reste du programme. Carte requise, annulez à tout moment dans Dashboard.Démarrer le trial de 7 jours →
← CoursSenior Deep-DivesModule 11 · Decorator patterns at scale@contextlib.contextmanager — context managers from generatorspredict154 / 161
+150 XP
Tâche
📝 **Tâche :** Prédisez la sortie de 11 lignes. Une « mesure(nom) » décorée par `@contextmanager` exécute la configuration avant le rendement et le démontage après. Trois with-blocks : utilisation normale, body-raises-exception (capté à l'extérieur) et le même nom de contexte réutilisé deux fois (chaque appel est un nouveau générateur). Faites attention à l'ordre de « <téléchargement » et « erreur réseau détectée » : la branche finale s'exécute AVANT que l'exception ne s'échappe. 📋 Implémentez la fonction ci-dessus. Les tests s'exécutent automatiquement. 💡 **Indice :** Relisez la théorie si vous êtes bloqué.
Prédis la sortie

Lis le code attentivement

from contextlib import contextmanager


events: list[str] = []


@contextmanager
def measure(name: str):
    events.append(f">{name}")
    try:
        yield {"name": name, "id": 42}
    finally:
        events.append(f"<{name}")


# 1. Normal use — yielded value bound to ctx
with measure("upload") as ctx:
    events.append(f"  inside: name={ctx['name']}, id={ctx['id']}")

# 2. Exception inside body — finally still runs, THEN exception escapes
try:
    with measure("download"):
        events.append("  download body")
        raise RuntimeError("network down")
except RuntimeError:
    events.append("  caught network error")

# 3. Same context name twice — each with-block creates a fresh generator
with measure("a"):
    pass
with measure("a"):
    pass

for e in events:
    print(e)

Que va afficher le programme ? Écris ici :

💬 Discussion

Soyez le premier à poser une question ou partager une astuce.
Connectez-vous pour rejoindre la discussion. La lecture est gratuite.
Chargement de la discussion…