Декоратор ретраев
Python
Middle
Сбер
01.01.2025
Реализуйте декоратор `retry(times: int)`, который повторяет вызов функции при возникновении исключения до `times` раз.
Если все попытки завершились исключением — последнее исключение пробрасывается наружу.
**Пример:**
```python
@retry(3)
def may_fail():
...
```
Ответы
Решение 1
```python
import functools
from typing import Callable, TypeVar
T = TypeVar("T")
def retry(times: int) -> Callable[[Callable[..., T]], Callable[..., T]]:
def decorator(func: Callable[..., T]) -> Callable[..., T]:
@functools.wraps(func)
def wrapper(*args, **kwargs) -> T:
last_exc: Exception | None = None
for _ in range(times):
try:
return func(*args, **kwargs)
except Exception as exc:
last_exc = exc
assert last_exc is not None
raise last_exc
return wrapper
return decorator
```