Проверяет понимание того, что декораторы в Python — это синтаксический сахар для передачи функции в другую функцию, и почему они работают только с вызываемыми объектами, а не с произвольными значениями.
В Python декоратор — это не отдельная сущность языка, а обычная функция (или любой вызываемый объект), которая принимает другую функцию и возвращает новую. Запись @decorator над определением функции — это лишь синтаксический сахар для func = decorator(func). Поэтому вопрос «почему декораторы нельзя применять к обычным функциям» чаще всего возникает из-за путаницы: на самом деле применять их можно к любой функции, но не к произвольным значениям.
Декоратор ожидает на вход вызываемый объект (callable): функцию, метод, класс или объект с методом __call__. Если передать число или строку, внутри декоратора при попытке вызвать func() возникнет TypeError: 'int' object is not callable. Именно это ограничение иногда формулируют как «нельзя применять к обычным значениям».
def log(func):
def wrapper(*args, **kwargs):
print(f"Calling {func.__name__}")
return func(*args, **kwargs)
return wrapper
@log
def add(a, b):
return a + b
print(add(2, 3)) # Calling add -> 5
Здесь add — самая обычная функция, и декоратор прекрасно работает. Ограничение не в «обычности», а в том, что декоратор должен получить callable.
@log x = 5 — синтаксически невозможно, потому что декоратор ставится только перед def, class или другим декоратором.len), её можно обернуть, но нельзя изменить её исходное поведение внутри C-реализации.functools.wraps, иначе теряются имя и docstring.Декораторы повсеместно используются для логирования, кэширования (functools.lru_cache), проверки прав, измерения времени, регистрации маршрутов во Flask/FastAPI. Они позволяют вынести сквозную логику из тела функции и переиспользовать её.
Итог: декораторы применяются к любым вызываемым объектам, включая обычные функции; ограничение касается только невызываемых значений и синтаксиса размещения. Понимание этого снимает распространённое заблуждение и помогает осознанно использовать декораторы для сквозной функциональности.