2016-12-10 13 views
0

Я новичок в python и пытаюсь понять функции и функции языков. Когда я запускаю приведенный ниже код, я получаю сообщение об ошибке. Msg «wrap() принимает 0 позиционных аргументов, но 2 даны«.Почему возникает ошибка msg, когда функция, принимающая n параметров, передается подфункции функции декоратора, которая содержит 0 аргументов

class dec: 

def decorator_function(orig): 
    def wrap(): 
     print('hi') 
     return orig 
    return wrap 

@decorator_function 
def display_inf(name, age): 
    print('dispInf ran with args ({},{})'.format(name,age)) 

display_inf('John',35) 

Я понимаю, что сообщ ошибка и если изменить функцию обертку, чтобы включить 2 параметра, как показано ниже, я бы не получить эту Сообщ. Однако то, что я не понимаю, почему питон бросает ошибку. Функция display_inf передается функции decorator_function, как и ожидалось, однако, что касается функции обертки, все, что она делает, это печать привет. Он даже не использует функцию, поэтому почему я все еще получаю эту ошибку, если я ее не использую. Что происходит за сценой, которая вызывает ошибку.

def decorator_function(orig): 
    def wrap(name, age): 
     print('hi') 
     return orig 
    return wrap 

ответ

1

При использовании декоратора, исходная функция заменяется с возвращаемым значением декоратора. В вашем примере display_inf заменен на wrap. Поскольку wrap не принимает аргументов, когда вы пытаетесь вызвать его с помощью аргументов, он терпит неудачу.

Вы, кажется, думаете, что wrap будет называться один раз и должен возвращать новую функцию, но это не так, как это работает. Сам декоратор (decorator_functrion) возвращает новую функцию, и в вашем случае, что она возвращает, wrap. wrap никогда не получает на самом деле ничего, потому что он вызывается с неправильным количеством аргументов.

+0

Благодарим вас за подробное объяснение. Теперь все имеет смысл :-) – Sharingan