Проверяет понимание декораторов как функции высшего порядка, изменяющей поведение другой функции без изменения её кода.
Декоратор — это паттерн проектирования и языковая конструкция, позволяющая обернуть функцию или метод, добавив ей дополнительное поведение до или после вызова. В Python декоратор — это обычная функция, которая принимает другую функцию как аргумент и возвращает новую функцию (обёртку). Синтаксис @decorator — это просто синтаксический сахар: @decorator\ndef f(): ... эквивалентно f = decorator(f).
Внутри декоратора создаётся вложенная функция-обёртка, которая вызывает оригинальную функцию. За счёт замыкания обёртка сохраняет ссылку на оригинал. Дополнительно можно использовать functools.wraps, чтобы сохранить имя и документацию исходной функции.
import functools
def log_calls(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f"Вызов {func.__name__} с {args} {kwargs}")
result = func(*args, **kwargs)
print(f"Результат: {result}")
return result
return wrapper
@log_calls
def add(a, b):
return a + b
add(2, 3) # Вызов add с (2, 3) {} / Результат: 5functools.lru_cache).Декораторы могут принимать аргументы: тогда нужен ещё один уровень вложенности — фабрика декораторов. Также можно декорировать методы классов, но важно учитывать передачу self через *args.
Итог: декораторы стоит применять для сквозной функциональности, которая не относится к бизнес-логике функции, — это делает код чище и позволяет переиспользовать поведение без дублирования.