Продвинутые декораторы
Python
Senior
Яндекс
Объясните, как написать декоратор с параметрами (например, `@retry(times=3)`), который сохраняет `__name__`, `__doc__` и корректно работает с любыми `*args`/`**kwargs`.
Ответы
Декоратор с параметрами
Декоратор с параметрами — это функция, которая возвращает обычный декоратор. Для сохранения метаданных используют `functools.wraps`.
Пример `retry`:
```python
import functools
import time
def retry(times=3, delay=0.1):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
last_exc = None
for _ in range(times):
try:
return func(*args, **kwargs)
except Exception as exc:
last_exc = exc
time.sleep(delay)
raise last_exc
return wrapper
return decorator
```