Декоратор — это функция, которая оборачивает другую функцию, добавляя ей поведение до или после вызова. Они строятся на замыканиях и используются для логирования, измерения времени, ретраев и других кросс-cutting задач.
Используйте @decorator для применения обёртки.
Внутри wrapper всегда принимайте *args, **kwargs и возвращайте результат оригинала.
Добавляйте @functools.wraps(func), чтобы сохранить имя и документацию функции.
Что запомнить: декоратор — это функция высшего порядка + замыкание. Порядок применения нескольких декораторов: снизу вверх.
Частая ошибка: забыть вернуть результат из wrapper — тогда вместо результата декорированной функции получится None.
О чём этот урок
Урок посвящён декораторам — функциям высшего порядка, которые позволяют изменять или расширять поведение других функций, не меняя их исходный код. Мы разберём синтаксис @, работу с аргументами, сохранение метаданных через functools.wraps, декораторы с аргументами и стекирование нескольких декораторов.
Что изучим
Где применяются декораторы: логирование, тайминг, retry, кэширование, валидация.
Декораторы для функций с аргументами — передача *args, **kwargs.
Возврат результата из вложенной функции-обёртки.
functools.wraps — сохранение __name__ и __doc__.
Декораторы с аргументами: фабрики декораторов.
Использование нескольких декораторов и порядок их выполнения.
Современные практики: PEP 8, type hints, f-strings, guard clauses.