Вопрос проверяет понимание того, как работают декораторы, замыкания и вложенные функции.
Параметризованный декоратор — это декоратор, который принимает аргументы. Для этого используется дополнительный уровень вложенности: внешняя функция принимает параметры, возвращает сам декоратор, а он уже принимает функцию. Внутри создаётся wrapper, который оборачивает вызов функции. Такая конструкция позволяет настраивать поведение декоратора.
Обычный декоратор принимает только функцию. Если нужно передать настройки, используется дополнительная функция.
Определение: Параметризованный декоратор — декоратор, который сначала принимает параметры, а затем функцию для оборачивания.
Появляется три уровня функций:
Функция с параметрами декоратора
Сам декоратор
Обёртка (wrapper)
def repeat(times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
func(*args, **kwargs)
return wrapper
return decorator
Использование:
@repeat(3)
def hello():
print("Hello")
hello()
Фактически происходит:
hello = repeat(3)(hello)
Внешняя функция создаёт замыкание, где хранится параметр times.
Внутренний декоратор получает функцию.
wrapper использует и параметры, и функцию.
логирование с уровнем детализации;
ретраи с числом попыток;
кэширование с настройками;
таймауты и ограничения.
Параметризованный декоратор реализуется через дополнительный уровень вложенной функции, позволяющий сохранить параметры в замыкании и использовать их внутри wrapper.