Что такое фабрика декораторов в Python?

Ответ

Фабрика декораторов — это функция высшего порядка, которая принимает аргументы и возвращает декоратор. Она позволяет создавать параметризованные декораторы, поведение которых можно настраивать при их применении.

Зачем это нужно? Стандартный декоратор не принимает аргументов. Фабрика добавляет дополнительный уровень вложенности, чтобы "захватить" параметры и передать их в логику декоратора.

Структура:

  1. Фабрика (внешняя функция): Принимает параметры (*args, **kwargs) и возвращает декоратор.
  2. Декоратор (средняя функция): Принимает декорируемую функцию (func) и возвращает обёртку.
  3. Обёртка (внутренняя функция): Выполняет основную логику, используя параметры из фабрики, и вызывает исходную функцию.

Пример: декоратор для повторного вызова функции

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.