Назад к вопросам
Middle
78
questionbank
Как написать декоратор в Python, который будет принимать параметры?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Декоратор, принимающий параметры, реализуется с помощью дополнительной внешней функции-фабрики. Эта функция принимает параметры декоратора и возвращает сам декоратор.
def parameterized_decorator(param1, param2):
// Фабрика декоратора: принимает параметры декоратора
def decorator(func):
// Сам декоратор: принимает декорируемую функцию
def wrapper(*args, **kwargs):
// Обертка: выполняет логику до и после вызова декорируемой функции
print(f"Параметры декоратора: {param1}, {param2}")
print(f"Вызов функции: {func.__name__} с аргументами: {args}, {kwargs}")
result = func(*args, **kwargs)
print(f"Результат функции: {result}")
return result
return wrapper
return decorator
# Использование декоратора с параметрами
@parameterized_decorator("значение1", 123)
def my_function(a, b):
return a + b
# Вызов декорированной функции
my_function(5, 10)
Пошаговое объяснение:
parameterized_decorator(param1, param2): Это функция-фабрика декоратора. Она принимает параметры, которые будут переданы декоратору при его применении (@parameterized_decorator("значение1", 123)). Возвращает сам декоратор (функциюdecorator).decorator(func): Это функция, которая действует как настоящий декоратор. Она принимает декорируемую функцию (my_functionв примере) в качестве аргумента. Возвращает функцию-обертку (wrapper).wrapper(*args, **kwargs): Это функция, которая заменяет оригинальную декорируемую функцию во время выполнения. Она принимает любые позиционные (*args) и именованные (**kwargs) аргументы, которые были переданы при вызове декорированной функции. Внутри этой функции реализуется логика декоратора (в данном случае — вывод параметров декоратора, информации о вызове и результата функции). Вызов оригинальной функции происходит черезfunc(*args, **kwargs).
Ключевые моменты:
- Необходима дополнительная внешняя функция для передачи параметров.
- Эта внешняя функция возвращает функцию, которая является "настоящим" декоратором.
- Настоящий декоратор возвращает функцию-обертку, которая содержит логику декоратора и вызывает исходную функцию.
- Синтаксис
@parameterized_decorator(param1, param2)при применении автоматически вызывает функцию-фабрику (parameterized_decorator) с указанными параметрами, а затем применяет возвращенный декоратор к следующей строке (декорируемой функции).