Python
Сложный
Как написать декоратор, который принимает дополнительные параметры?
Декораторы с параметрами в Python
Базовый декоратор (без параметров):
def my_decorator(func):
def wrapper(*args, **kwargs):
print("Before")
result = func(*args, **kwargs)
print("After")
return result
return wrapper
@my_decorator
def say_hello():
print("Hello!")
Декоратор с параметрами:
Требуется три уровня вложенности:
def repeat(times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(times=3)
def greet(name):
print(f"Hello, {name}!")
greet("World")
# Hello, World!
# Hello, World!
# Hello, World!
Универсальный декоратор (с параметрами и без):
import functools
def smart_decorator(func=None, *, prefix="LOG"):
def decorator(fn):
@functools.wraps(fn)
def wrapper(*args, **kwargs):
print(f"[{prefix}] Calling {fn.__name__}")
return fn(*args, **kwargs)
return wrapper
if func is not None:
return decorator(func)
return decorator
# Оба варианта работают:
@smart_decorator
def foo(): pass
@smart_decorator(prefix="DEBUG")
def bar(): pass
Декоратор-класс:
class Retry:
def __init__(self, max_attempts=3):
self.max_attempts = max_attempts
def __call__(self, func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
for attempt in range(self.max_attempts):
try:
return func(*args, **kwargs)
except Exception as e:
if attempt == self.max_attempts - 1:
raise
return wrapper
@Retry(max_attempts=5)
def unstable_operation():
pass
Похожие вопросы
Готовитесь к собеседованию?
ENIGMA AI — невидимый ИИ-помощник для технических интервью
Попробовать бесплатно