Retry-декоратор

MediumАлгоритмы
07:00
Лучше работает на десктопе
DecoratorsExceptionsRetries
Мой собес15:25-31:262026-02-20 18-04-44.movСтраница собеса

Реализуйте декоратор retry, который повторяет вызов функции при указанном типе исключения.

Декоратор должен:

  • вызывать исходную функцию и возвращать ее результат при успехе;
  • повторять вызов только если упало исключение типа on;
  • любые другие исключения пробрасывать сразу;
  • если все попытки закончились исключением on, пробросить последнее исключение;
  • сохранить имя исходной функции через functools.wraps.

Сигнатура

def retry(on: type[Exception], num_attempts: int = 1):

В тренажере тесты вызывают helper run_retry_case(...), который уже есть в starter code. Вам нужно реализовать именно retry.

Примеры

Пример 1

Вход:
on = ["KeyError","KeyError","ok:done"]
num_attempts = "KeyError"
arg3 = 3
Выход:{"status":"ok","value":"done","calls":3,"name":"flaky"}

Успех на третьей попытке после двух retryable ошибок

Пример 2

Вход:
on = ["KeyError","KeyError","KeyError"]
num_attempts = "KeyError"
arg3 = 3
Выход:{"status":"error","error":"KeyError","calls":3,"name":"flaky"}

Последняя retryable ошибка пробрасывается наружу

Пример 3

Вход:
on = ["ValueError","ok:done"]
num_attempts = "KeyError"
arg3 = 3
Выход:{"status":"error","error":"ValueError","calls":1,"name":"flaky"}

Другой тип исключения не ретраится

Консоль
Нажмите Run или Ctrl+Enter для запуска