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, лямбда