Короткий ответ Декоратор — функция, принимающая другую функцию и возвращающая новую функцию (обычно wrapper), которая добавляет поведение до/после вызова оригинала без изменения его кода. Как это работает подробнее Синтаксис @decorator над определением функции эквивалентен func = decorator(func) — декоратор получает исходную функцию, внутри определяет wrapper, вызывающий оригинал и добавляющий логику, и возвращает wrapper вместо исходной функции. Пример кода Что использовать на практике Практика. Декораторы удобны для сквозной функциональности: логирования, замера времени, проверки прав доступа, кэширования — без дублирования кода в каждой функции. wrapper должен пробрасывать аргументы через *args, kwargs, чтобы не ограничивать сигнатуру оригинала. Подводные камни Риски. Забывают вернуть результат вызова оригинальной функции из wrapper (функция тогда всегда возвращает None); не пробрасывают *args/kwargs, из-за чего декорированная функция перестаёт принимать аргументы, которые принимала исходная.