Назад к вопросам
Middle
78
questionbank

Как написать декоратор в Python, который будет принимать параметры?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Декоратор, принимающий параметры, реализуется с помощью дополнительной внешней функции-фабрики. Эта функция принимает параметры декоратора и возвращает сам декоратор.

def parameterized_decorator(param1, param2):
    // Фабрика декоратора: принимает параметры декоратора

    def decorator(func):
        // Сам декоратор: принимает декорируемую функцию

        def wrapper(*args, **kwargs):
            // Обертка: выполняет логику до и после вызова декорируемой функции
            print(f"Параметры декоратора: {param1}, {param2}")
            print(f"Вызов функции: {func.__name__} с аргументами: {args}, {kwargs}")
            result = func(*args, **kwargs)
            print(f"Результат функции: {result}")
            return result

        return wrapper

    return decorator

# Использование декоратора с параметрами
@parameterized_decorator("значение1", 123)
def my_function(a, b):
    return a + b

# Вызов декорированной функции
my_function(5, 10)

Пошаговое объяснение:

  1. parameterized_decorator(param1, param2): Это функция-фабрика декоратора. Она принимает параметры, которые будут переданы декоратору при его применении (@parameterized_decorator("значение1", 123)). Возвращает сам декоратор (функцию decorator).
  2. decorator(func): Это функция, которая действует как настоящий декоратор. Она принимает декорируемую функцию (my_function в примере) в качестве аргумента. Возвращает функцию-обертку (wrapper).
  3. wrapper(*args, **kwargs): Это функция, которая заменяет оригинальную декорируемую функцию во время выполнения. Она принимает любые позиционные (*args) и именованные (**kwargs) аргументы, которые были переданы при вызове декорированной функции. Внутри этой функции реализуется логика декоратора (в данном случае — вывод параметров декоратора, информации о вызове и результата функции). Вызов оригинальной функции происходит через func(*args, **kwargs).

Ключевые моменты:

  • Необходима дополнительная внешняя функция для передачи параметров.
  • Эта внешняя функция возвращает функцию, которая является "настоящим" декоратором.
  • Настоящий декоратор возвращает функцию-обертку, которая содержит логику декоратора и вызывает исходную функцию.
  • Синтаксис @parameterized_decorator(param1, param2) при применении автоматически вызывает функцию-фабрику (parameterized_decorator) с указанными параметрами, а затем применяет возвращенный декоратор к следующей строке (декорируемой функции).