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). - Примечание: Не путать с паттерном проектирования, см. паттерн «Декоратор».