Обработка аргументов в декораторах - PullRequest
0 голосов
/ 06 июня 2019

У меня есть следующий пример декоратора:

def decorator_function1(original_function):
    def wrapper_function1(*args, **kwargs):
        print('wrapper executed this before {}'.format(original_function.__name__))
        return original_function(*args, **kwargs)
    return wrapper_function1

@decorator_function1
def display_info(name, age):
    print('display_info ran with arguments ({}, {})'.format(name, age))

display_info('John', 25)

что я бьюсь со строкой: def wrapper_function1(*args, **kwargs): даже после прочтения множества уроков декоратора

  1. Я не понимаю, почему * и ** вообще нужны в def wrapper_function1 (), если они приходят сюда, возвращают original_function (* args, ** kwargs).Разве это не избыточно?

  2. Если я уйду * и ** в def wrapper_function1(), я получу ошибку: TypeError: wrapper_function1() takes 0 positional arguments but 2 were given, но почему wrapper_function1 знает об аргументах display info?Я просто не вижу, где их сдают.Что-то вроде этого имело бы смысл для меня

    def decorator_function1 (original_function, * args, ** kwargs)): my_args = args my_kwargs = kwargs def wrapper_function (args, kwargs) ....

1 Ответ

0 голосов
/ 06 июня 2019

Потому что написание этого

@decorator_function1
def display_info(name, age):
    # some code

- это просто "синтетический сахар" для этого:

def display_info(name, age):
    # some code

display_info = decorator_function1(display_info)

Вот как теперь функция display_info знает о decorator_function.

...