Вопрос проверяет понимание механизма передачи аргументов в декораторы Python, что необходимо для создания гибких и переиспользуемых обёрток функций.
Декоратор в Python — это функция, которая принимает другую функцию в качестве аргумента и возвращает новую функцию, обычно добавляя какую-то логику. Передача аргументов происходит в два этапа: сначала аргументы могут быть переданы самому декоратору (если он параметризован), а затем аргументы передаются в декорируемую функцию при её вызове.
Простейший декоратор принимает только один аргумент — саму декорируемую функцию. Аргументы же вызова этой функции передаются во внутреннюю функцию-обёртку (wrapper).
def my_decorator(func):
def wrapper(*args, **kwargs):
print("До вызова функции")
result = func(*args, **kwargs)
print("После вызова функции")
return result
return wrapper
@my_decorator
def greet(name):
print(f"Привет, {name}!")
greet("Анна") # Аргумент "Анна" передаётся в wrapperЧтобы декоратор сам принимал аргументы, нужна дополнительная "обёртка". Создаётся функция, которая принимает аргументы декоратора и возвращает собственно декоратор, который уже принимает функцию. Это позволяет параметризовать поведение декоратора.
def repeat(times):
# times — аргумент декоратора
def decorator(func):
# func — декорируемая функция
def wrapper(*args, **kwargs):
# *args, **kwargs — аргументы вызова функции
for _ in range(times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(times=3)
def say_hello():
print("Hello!")
say_hello() # Выведет "Hello!" три раза@repeat(times=3) сначала вызывается repeat(3), который возвращает функцию decorator.decorator применяется к функции say_hello, принимая её как аргумент.wrapper, который при вызове будет выполнять say_hello указанное количество раз.Декораторы с аргументами часто используются для настройки логирования, кэширования, проверки прав доступа или повторных попыток (retry). Например, декоратор для кэша может принимать время жизни кэша в секундах.
Вывод: Передача аргументов в декоратор позволяет создавать гибкие и переиспользуемые компоненты. Используйте декораторы с аргументами, когда нужно параметризовать их поведение, а простые декораторы — для стандартной обёртки логики вокруг функций.