Назад к вопросам
Middle
68
questionbank
Как реализовать декоратор с аргументами?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Для создания декоратора с аргументами нужно использовать дополнительную обертку. Внешняя функция будет принимать аргументы декоратора, средняя — саму декорируемую функцию, а внутренняя — аргументы декорируемой функции.
import functools
def decorator_with_args(arg1, arg2):
// Внешняя функция принимает аргументы декоратора.
def actual_decorator(func):
// Средняя функция принимает декорируемую функцию.
@functools.wraps(func) // Сохраняет метаданные исходной функции.
def wrapper(*args, **kwargs):
// Внутренняя функция принимает аргументы декорируемой функции.
print(f"Декоратор вызван с аргументами: {arg1}, {arg2}")
print(f"Вызывается функция: {func.__name__}")
print(f"С аргументами: {args}, {kwargs}")
result = func(*args, **kwargs)
print(f"Функция вернула: {result}")
return result
return wrapper
return actual_decorator
# Пример использования
@decorator_with_args("привет", 123)
def my_function(a, b):
return a + b
# Вызов декорированной функции
print(my_function(5, 7))
При вызове @decorator_with_args("привет", 123) сначала выполняется decorator_with_args("привет", 123). Эта функция возвращает actual_decorator. Затем @ применяет actual_decorator к my_function. В итоге, my_function заменяется функцией wrapper.