Ответ
Фабрика декораторов — это функция высшего порядка, которая принимает аргументы и возвращает декоратор. Она позволяет создавать параметризованные декораторы, поведение которых можно настраивать при их применении.
Зачем это нужно? Стандартный декоратор не принимает аргументов. Фабрика добавляет дополнительный уровень вложенности, чтобы "захватить" параметры и передать их в логику декоратора.
Структура:
- Фабрика (внешняя функция): Принимает параметры (
*args
,**kwargs
) и возвращает декоратор. - Декоратор (средняя функция): Принимает декорируемую функцию (
func
) и возвращает обёртку. - Обёртка (внутренняя функция): Выполняет основную логику, используя параметры из фабрики, и вызывает исходную функцию.
Пример: декоратор для повторного вызова функции
import functools
# Уровень 1: Фабрика, принимающая параметр `times`
def repeat(times: int):
# Уровень 2: Сам декоратор, принимающий функцию
def decorator(func):
@functools.wraps(func) # Сохраняет метаданные исходной функции
# Уровень 3: Обёртка, выполняющая логику
def wrapper(*args, **kwargs):
print(f"Функция '{func.__name__}' будет вызвана {times} раз.")
last_result = None
for _ in range(times):
last_result = func(*args, **kwargs)
return last_result
return wrapper
return decorator
# Применение фабрики для создания и вызова декоратора
@repeat(3)
def greet(name):
print(f"Hello, {name}!")
greet("World")
# Вывод:
# Функция 'greet' будет вызвана 3 раз.
# Hello, World!
# Hello, World!
# Hello, World!
Таким образом, фабрика repeat(3)
создаёт и возвращает декоратор, который уже применяется к функции greet
.