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). - Примітка: Не плутати з патерном проєктування, див. патерн «Декоратор».