Урок 64. Декораторы

📁 Блок: Python Fundamentals / Функции ⏱️ Время изучения: ~90 мин 🎯 Сложность: Средняя
#functools #def #print #return #basicconfig #add #import #with #upper #range #for #in #open #read #try #except #as #if #time #isinstance #not #raise #random #yield #pass #property #staticmethod #classmethod

⚡ Кратко: суть урока

Декоратор — это функция, которая оборачивает другую функцию, добавляя ей поведение до или после вызова. Они строятся на замыканиях и используются для логирования, измерения времени, ретраев и других кросс-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.

📚 Что повторить перед изучением

🎯 Что изучать дальше

  • → Урок 65 — Практикум 16
  • Попробуйте написать собственные декораторы: для кэширования, авторизации, валидации аргументов.
  • Изучите встроенные декораторы @property, @staticmethod, @classmethod.