Код Senior Функции и области видимости обновлено

Повтор вызова с ограничением попыток

Условие

Напишите retry(fn, attempts, retry_on): вызывает fn() до attempts раз; если fn бросает исключение, имя класса которого есть в retry_on, пробует снова; другие исключения пробрасывает сразу; если попытки кончились, пробрасывает последнее исключение. Проверка run(script, attempts, retry_on): script это список результатов по попыткам, строка "!Имя" значит «бросить исключение Имя» (ValueError, KeyError, TimeoutError). run возвращает ["ok", значение, число_вызовов] или ["error", имя_исключения, число_вызовов]. Реализуйте retry.

Примеры

run([5], 3, ["TimeoutError"]) // ["ok", 5, 1]
run(["!TimeoutError", "!TimeoutError", 7], 3, ["TimeoutError"]) // ["ok", 7, 3]
run(["!TimeoutError"], 3, ["TimeoutError"]) // ["error", "TimeoutError", 3]

Как подойти

Подсказки: 2
  1. for _ in range(attempts) и try/except внутри.
  2. Голый raise пробрасывает текущее исключение без потери traceback.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.