К задачам

Retry-декоратор

СредняяАлгоритмы
Лучше работает на десктопе
ДекораторыИсключенияПовторы

Реализуйте декоратор 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"}

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

Код
Python · Ctrl/⌘ + Enter для запуска
Лимит
07:00
Консоль
Нажмите кнопку запуска или Ctrl+Enter
Retry-декоратор — Алгоритмы задача — ML Mentor