def decorator_with_args(arg1, arg2):
def actual_decorator(func):
def wrapper(*args, **kwargs):
print(f"Аргументы декоратора: {arg1}, {arg2}")
# Дополнительная логика до вызова функции
result = func(*args, **kwargs)
# Дополнительная логика после вызова функции
return result
return wrapper
return actual_decorator
@decorator_with_args("значение1", "значение2")
def my_function():
print("Функция выполняется")
my_function()
Декоратор с аргументами - это функция, которая возвращает декоратор. Это позволяет передавать параметры в декоратор при его применении.
Вот пример реализации:
def decorator_with_arguments(argument1, argument2):
def actual_decorator(func):
def wrapper(*args, **kwargs):
print(f"Декоратор вызван с аргументами: {argument1}, {argument2}")
print(f"Выполняется функция: {func.__name__}")
# Здесь можно выполнить любую дополнительную логику, используя argument1 и argument2
result = func(*args, **kwargs) # Вызываем исходную функцию
print(f"Функция {func.__name__} завершила выполнение")
return result
return wrapper
return actual_decorator
# Пример использования
@decorator_with_arguments("Hello", "World")
def my_function(x, y):
print(f"Функция my_function вызвана с аргументами: {x}, {y}")
return x + y
result = my_function(5, 10)
print(f"Результат: {result}")
# Альтернативный способ применения (без @ синтаксиса):
# my_function = decorator_with_arguments("Hello", "World")(my_function)
Разберем по частям:
decorator_with_arguments(argument1, argument2)
: Это внешняя функция, которая принимает аргументы, предназначенные для конфигурации декоратора. Она возвращает actual_decorator
.actual_decorator(func)
: Эта функция принимает декорируемую функцию func
в качестве аргумента и возвращает wrapper
. Это стандартный декоратор.wrapper(*args, **kwargs)
: Это обертка, которая выполняется при каждом вызове декорируемой функции. Здесь можно добавить логику до и после вызова исходной функции.func(*args, **kwargs)
: Это вызов исходной функции с переданными ей аргументами.Объяснение работы:
@decorator_with_arguments("Hello", "World")
перед определением функции my_function
, Python сначала вызывает decorator_with_arguments("Hello", "World")
. Эта функция возвращает actual_decorator
.actual_decorator
вызывается с my_function
в качестве аргумента. actual_decorator
возвращает wrapper
.my_function
заменяется на wrapper
.my_function(5, 10)
, на самом деле вызывается wrapper(5, 10)
. wrapper
выполняет свою логику (например, печатает аргументы), вызывает исходную my_function(5, 10)
и возвращает результат.Преимущества использования декораторов с аргументами:
Примеры использования: