Что такое декоратор в Python и для чего он используется?
Что проверяют
Понимаете ли вы, что функции в Python это обычные объекты, которые можно передавать и возвращать. Декоратор проверяет именно это, а заодно знание синтаксического сахара, который встречается в любом фреймворке.
Как отвечать
Декоратор это функция, которая принимает другую функцию и возвращает новую, добавляя поведение вокруг исходной, не трогая её код. Запись @decorator над функцией это то же самое, что func = decorator(func).
import functools
def logged(func):
@functools.wraps(func) # сохраняет имя и docstring исходной функции
def wrapper(*args, **kwargs):
print(f"вызов {func.__name__}")
return func(*args, **kwargs)
return wrapper
@logged
def pay(amount):
return amountГде применяется на практике: логирование, замер времени, кэш (functools.lru_cache), проверка прав, повтор при ошибке, регистрация обработчика (маршруты во Flask и FastAPI), транзакции.
Если нужны параметры, добавляется ещё один уровень: @retry(times=3) это функция, которая возвращает декоратор.
Где спотыкаются
Забывают functools.wraps. Без него у обёрнутой функции подменяются __name__ и __doc__, и ломается всё, что смотрит на имя: автодокументация, регистрация маршрутов, отладка.
Теряют *args, **kwargs и возвращаемое значение. Обёртка без return func(...) молча превращает функцию в возвращающую None.
Не различают декоратор функции и декоратор класса, а также встроенные @property, @staticmethod, @classmethod, про них спрашивают следом почти всегда.
И порядок: при нескольких декораторах ближайший к функции применяется первым, а выполняется его обёртка последней.