EMZETT.
Войти

Python: декораторы

Коротко: Декоратор — функция, которая принимает другую функцию и возвращает её расширенную версию. Применяют его через @имя над функцией.

Подробнее: Он оборачивает исходную функцию, чтобы сделать что-то до или после: замерить время, проверить доступ, кэшировать результаты, протоколировать вызовы.

Подробности

import functools, time
 
def timing(f):
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = f(*args, **kwargs)
        print(f.__name__, time.perf_counter() - start)
        return result
    return wrapper
 
@timing
def compute(n): ...
  • Равнозначно: @timing над compute — то же, что compute = timing(compute).
  • functools.wraps: Сохраняет имя и документацию исходной функции. Без неё функция выглядит как wrapper.
  • С параметрами: Декоратор с аргументами (@repeat(3)) — функция, возвращающая декоратор (ещё один уровень вложенности).
  • Встроенные и известные: @staticmethod, @property, @functools.lru_cache, маршруты во Flask (@app.route), @pytest.fixture.
  • Классы: Декораторы могут расширять и классы (@dataclass).
  • Примечание: Не путать с паттерном проектирования, см. паттерн «Декоратор».

См. также: dataclass, лямбда