Нужно ли использовать значение функции в завернутой функции декоратора? - PullRequest
0 голосов
/ 06 ноября 2019
def div2(mult):
    def display():

        print(f"we are doing a check of multiples if div by 2")
        if mult%2==0:
            return f"{mult} is divisible"
    return display

@div2
def multi(n):
    return n*n*n

print(multi(5))

В видео, которое я узнал, нам не нужно передавать аргумент для функции с переносом (например, в этом примере), аргумент основной функции (в данном случае div2) будет использоваться в функции с переносом. Когда я попробовал то же самое для приведенного выше кода, я получил TypeError, что display() нуждается в параметре.

Теперь смущен тем, что в этом случае все мои 3 функции должны иметь параметры, как показано ниже: div2()-> multi() сама функция в качестве параметра display() -> параметр для отображения значения функции multi() multi() -> параметр для выполнения математических операций

Примечание: Когда я сделал display()взять параметр, код сработал

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Проблема не в том, что display не принимает аргумент;это то, что вы используете это, как будто это делает. Помните, что синтаксис декоратора является просто синтаксическим сахаром для

def multi(n):
    return n*n*n

multi = div2(multi)

Результат div2 не требуется для сохранения подписи аргумента div2, хотя вы должны знать, если это так или нетпрежде чем вы сможете использовать этот результат.

Аргумент div2 - это функция, а не то, что вы можете разделить на 2. Ваш декоратор должен быть

def div2(f):
    def display(x):
        print(f"We are doing a check of multiples if div by 2")
        if f(x) % 2 == 0:
            return f"{x} is divisible"
    return display

@div2
def multi(n):
    return n*n*n

prin(multi(5))
0 голосов
/ 06 ноября 2019

Здесь multi принимает один параметр с именем n.

def multi(n):
    return n*n*n

И использование синтаксиса декоратора фактически аналогично использованию:

multi = div2(multi)

Таким образом, если вы хотите иметь возможностьдля передачи параметров в оболочку display необходимо определить параметры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...