Перейти до основного вмісту
🔒 Режим прев'ю. Перші 15 уроків Foundations — безкоштовні; цей — Pro. Запусти 7-денний trial щоб відкрити редактор, AI-підказки і решту курсу. Потрібна картка, скасування в Dashboard у будь-який момент.Почати 7-денний trial →
← КурсиSenior Deep-DivesModule 11 · Decorator patterns at scale@contextlib.contextmanager — context managers from generatorspredict154 / 161
+150 XP
Завдання
📝 **Завдання:** Спрогнозуйте 11-рядковий вихід. `@contextmanager`-декорований `measure(name)` запускає налаштування перед yield і teardown після. Три with-блоки: звичайне використання, body-raises-exception (виявлене зовні) і те саме контекстне ім’я, що використовується повторно двічі (кожен виклик є новим генератором). Зверніть увагу на порядок `<завантаження` проти `виявленої помилки мережі` — остаточне розгалуження запускається ДО того, як виникне виняток. 📋 Реалізуйте наведену вище функцію. Тести запускаються автоматично. 💡 **Підказка:** Перечитайте теорію, якщо ви застрягли.
Передбач вивід

Прочитай код уважно

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)

Що виведе програма? Напиши тут:

💬 Обговорення

Будьте першим — поставте запитання або поділіться порадою.
Увійдіть щоб приєднатися до обговорення. Читання безкоштовне.
Завантаження обговорення…