Przejdź do treści głównej
🔒 Tryb podglądu. Pierwszych piętnaście lekcji Foundations jest darmowych; ta jest Pro. Rozpocznij 7-dniowy trial, aby odblokować edytor, podpowiedzi AI i resztę kursu. Wymagana karta, anulujesz w dowolnym momencie w Dashboard.Rozpocznij 7-dniowy trial →
← KursySenior Deep-DivesModule 11 · Decorator patterns at scale@contextlib.contextmanager — context managers from generatorspredict154 / 161
+150 XP
Zadanie
📝 **Zadanie:** Przewiduj 11-liniowy wynik. Ozdobiona „@contextmanager” „miara (nazwa)” uruchamia instalację przed uzyskiem i rozbijanie po. Trzy bloki z: normalne użycie, wyjątek body-raises (wyłapany na zewnątrz) i ta sama nazwa kontekstu użyta ponownie dwukrotnie (każde wywołanie to nowy generator). Zwróć uwagę na kolejność „<pobieranie” i „wychwycony błąd sieci” — ostatnia gałąź działa PRZED wyjściem wyjątku. 📋 Zaimplementuj powyższą funkcję. Testy uruchamiają się automatycznie. 💡 **Wskazówka:** Jeśli utkniesz, przeczytaj ponownie teorię.
Przewiduj wynik

Przeczytaj kod uważnie

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)

Co wypisze program? Napisz tutaj:

💬 Dyskusja

Zadaj pierwsze pytanie lub podziel się wskazówką.
Zaloguj się aby dołączyć do dyskusji. Czytanie jest darmowe.
Ładowanie dyskusji…