Вопрос проверяет понимание функций как объектов и механизма обёрток в Python.
Декоратор — это функция, которая принимает другую функцию и возвращает новую. Внутри создаётся обёртка, добавляющая дополнительное поведение. Обычно используется вложенная функция. Для сохранения имени и документации применяют functools.wraps. Декораторы позволяют переиспользовать код.
Декораторы — это синтаксический сахар над функциями высшего порядка.
Определение:
Декоратор — это функция, которая расширяет поведение другой функции без изменения её кода.
Пример:
def my_decorator(func):
def wrapper():
print("До вызова")
func()
print("После вызова")
return wrapper
Использование:
@my_decorator
def say_hello():
print("Привет")
def my_decorator(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
Без wraps теряется информация о функции.
Пример:
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
Логирование
Аутентификация
Кэширование
Валидация
Вывод:
Декораторы удобны для добавления общего поведения и позволяют писать чистый и переиспользуемый код.