Как можно передать параметр в декораторе во время выполнения программы?

Можно ли передать значения переменных a1 и a2 в аргументы p1 и p2 после их получения из консоли?
  • 11 ноября 2023 г. 17:09
Ответы на вопрос 2
Параметры в декораторе можно передать с помощью замыкания или с помощью аргументов декоратора.

Вот пример использования замыкания:
```python
def my_decorator(p1, p2):
    def inner_decorator(func):
        def wrapper(*args, **kwargs):
            # Внутри декоратора доступны параметры p1 и p2
            print(f"p1 = {p1}, p2 = {p2}")
            return func(*args, **kwargs)
        return wrapper
    return inner_decorator

a1 = input("Введите значение для a1: ")
a2 = input("Введите значение для a2: ")

@my_decorator(a1, a2)
def my_function():
    print("Функция выполнена")

my_function()
```

Необходимые значения переменных a1 и a2 можно передать в аргументы p1 и p2 при использовании декоратора следующим образом:
```python
def my_decorator(func):
    def wrapper(*args, **kwargs):
        # Внутри декоратора доступны параметры p1 и p2
        print(f"p1 = {kwargs['p1']}, p2 = {kwargs['p2']}")
        return func(*args, **kwargs)
    return wrapper

a1 = input("Введите значение для a1: ")
a2 = input("Введите значение для a2: ")

@my_decorator
def my_function(*args, **kwargs):
    print("Функция выполнена")

my_function(p1=a1, p2=a2)
```

Оба этих способа позволяют передать значения переменных a1 и a2 в аргументы p1 и p2 после их получения из консоли.
Декорируйте функцию после получения параметров:
def csv_reader(filename, request):
    ...

_temp = formatter(p1, p2)
csv_reader = _temp(csv_reader)

Альтернативно, возвращайте функцию с дополнительными свойствами:
def formatter(parse_func):
    def output_func(*args):
        ...

    output_func.p1 = p1
    output_func.p2 = p2
    return output_func

@formatter
def csv_reader(filename, request):
    ...

csv_reader.p1 = a1
csv_reader.p2 = a2

Вместо функции можно вернуть объект класс, имеющий метод __call__(), и нужными свойствами и методами.
Похожие вопросы