Перейти до основного вмісту
🔒 Режим прев'ю. Перші 15 уроків Foundations — безкоштовні; цей — Pro. Запусти 7-денний trial щоб відкрити редактор, AI-підказки і решту курсу. Потрібна картка, скасування в Dashboard у будь-який момент.Почати 7-денний trial →
← КурсиSenior Deep-DivesModule 9 · Error handling depthRetry decorator — bounded attempts + exponential backoff + targeted catchpredict140 / 161
+150 XP
Завдання
📝 **Завдання:** Передбачте точний вихід у 6 рядках. Декоратор `retry` з `max_attempts=4, base_delay=1, retry_on=(ValueError,)` обертає `flaky()`. Функція зазнає невдачі під час спроб 1 і 2 (викликає помилку ValueError) і вдасться під час спроби 3 (поверне «ок»). Декоратор реєструє кожну спробу + сон, який мав статися. Передбачте друк результатів, лічильник викликів і рядки журналу. 📋 Реалізуйте наведену вище функцію. Тести запускаються автоматично. 💡 **Підказка:** Перечитайте теорію, якщо ви застрягли.
Передбач вивід

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

from functools import wraps


attempts_log: list[str] = []


def retry(max_attempts: int = 3, base_delay: float = 0, retry_on: tuple = (Exception,)):
    def decorator(fn):
        @wraps(fn)
        def wrapper(*args, **kwargs):
            attempt = 0
            while True:
                attempt += 1
                try:
                    return fn(*args, **kwargs)
                except retry_on as e:
                    attempts_log.append(f"attempt {attempt} failed: {type(e).__name__}")
                    if attempt >= max_attempts:
                        attempts_log.append("giving up")
                        raise
                    # In real code: time.sleep(base_delay * (2 ** (attempt - 1)))
                    # Here we log the would-be sleep for the predict trace.
                    attempts_log.append(f"sleep {base_delay * (2 ** (attempt - 1))}")
        return wrapper
    return decorator


calls = [0]


@retry(max_attempts=4, base_delay=1, retry_on=(ValueError,))
def flaky() -> str:
    calls[0] += 1
    if calls[0] < 3:
        raise ValueError(f"fail #{calls[0]}")
    return "ok"


result = flaky()
print(f"result: {result}")
print(f"calls: {calls[0]}")
for line in attempts_log:
    print(line)

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

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

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