Декоратор — это функция, которая оборачивает другую функцию для изменения или расширения её поведения — без изменения кода исходной функции. Она принимает функцию как входной параметр и возвращает новую, улучшенную версию.
Основной паттерн состоит из трёх компонентов:
def my_decorator(func):
def wrapper(*args, **kwargs):
print("Before the function runs")
result = func(*args, **kwargs)
print("After the function runs")
return result
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
Использование @my_decorator — это синтаксический сахар для:
say_hello = my_decorator(say_hello)
Всегда используй *args и **kwargs в обёртке, чтобы гарантировать, что декоратор работает с любой сигнатурой функции. Также хорошей практикой считается применять functools.wraps для сохранения метаданных исходной функции:
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
Синтаксис @decorator — это просто синтаксический сахар, эквивалентный переприсваиванию функции результату вызова функции-декоратора с исходной функцией в качестве аргумента.
Новый — ещё не проверен сообществом
Вы