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) и возвращает результат.Преимущества использования декораторов с аргументами:
Примеры использования: