В цепочке декоратора выполнялась ли функция, которую мы передаем декоратору, дважды? - PullRequest
0 голосов
/ 13 января 2020
def pass_through1(func):
    def inner1(*args):
        test_logs.append("pt1")
        return func(*args)
    return inner1

def pass_through2(func):
    def inner2(*args):
        test_logs.append("pt2")
        return func(*args)
    return inner2

@pass_through1
@pass_through2
def increment(num):
    return num+1

test_logs=[]
increment(10) //gives me the answer as 11
test_logs=['pt1','pt2'] //now test_log contains after the calling the increment function 

Теперь я сомневаюсь, что функция приращения выполняется дважды? Как мы передаем его двум декораторам.

1 Ответ

0 голосов
/ 13 января 2020

Вы не передаете increment обоим декораторам; вы передаете increment декоратору pass_through2, и это возвращает функцию с именем inner2, которая передается другому декоратору pass_through1. Этот декоратор возвращает функцию с именем inner1, которая в конце концов связана с именем increment.

Так что, когда вы вызываете increment, он действительно вызывает inner1, который затем вызывает inner2, что вызывает исходная функция increment - один раз - и каждый из inner1 и inner2 регистрирует один раз.

...