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

Как реализовать декоратор с аргументами?

Sobes Copilot

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

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

sobes.tech AI

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

import functools

def decorator_with_args(arg1, arg2):
    // Внешняя функция принимает аргументы декоратора.
    def actual_decorator(func):
        // Средняя функция принимает декорируемую функцию.
        @functools.wraps(func)  // Сохраняет метаданные исходной функции.
        def wrapper(*args, **kwargs):
            // Внутренняя функция принимает аргументы декорируемой функции.
            print(f"Декоратор вызван с аргументами: {arg1}, {arg2}")
            print(f"Вызывается функция: {func.__name__}")
            print(f"С аргументами: {args}, {kwargs}")
            result = func(*args, **kwargs)
            print(f"Функция вернула: {result}")
            return result
        return wrapper
    return actual_decorator

# Пример использования
@decorator_with_args("привет", 123)
def my_function(a, b):
    return a + b

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

При вызове @decorator_with_args("привет", 123) сначала выполняется decorator_with_args("привет", 123). Эта функция возвращает actual_decorator. Затем @ применяет actual_decorator к my_function. В итоге, my_function заменяется функцией wrapper.