2017-02-07 3 views
0

Я пытаюсь написать декоратор в python 3, который в основном хранит подсчет количества раз, когда функция вызывается. Вот мой код:Декоратор в последовательности вызова python

def call_counter(func): 
    def helper(x): 
     helper.calls += 1 
     return func(x) 

    helper.calls = 0 

    return helper 


@call_counter 
def succ(x): 
    return x + 1 

for i in range(10): 
    print(succ(i)) # <--- ?? 

Я понимаю, как декоратор работает, но только путаница у меня есть вот что первый когда-либо позвонить в SUCC (х) получает функцию взамен @call_counter декоратора. Однако основная путаница здесь, я не совсем понимаю, как здесь происходят последовательные вызовы внутри цикла for?

Итак, как происходит поток после того, как мы получили возвращенную функцию (помощник в этом случае) от первого вызова.

Теперь внутри цикла for, succ (0), succ (1) и так далее, вызывается, как это работает? Повторно ли мы используем ту же возвращенную функцию, которую мы получили от первого вызова, или же вызывающий вызывает каждый раз, когда цикл for добавляется 1?

ответ

1

Декоратор применяется только один раз, когда он выполняется, и после этого все вызовы succ используют ту же функцию, которую вы вернули helper.

Это можно увидеть, если вы только что напечатали объект функции внутри for цикла вместо вызова его:

for i in range(10): 
    print(succ) 
<function call_counter.<locals>.helper at 0x7fe4d05139d8> 
<function call_counter.<locals>.helper at 0x7fe4d05139d8> 
# ... so on, ten times. 

Поток прямолинейно, helper называется каждый раз с аргументом x который передается в func.

+0

Стоит упомянуть, что если вы хотите сделать свой декоратор прозрачным, вы можете использовать 'functools.wraps'. – khachik

+0

Спасибо Джим, но я думаю, что u предназначался для размещения печати (succ) внутри succ(), а не внутри цикла for right? но я понимаю вашу точку зрения. – skyrocker

Смежные вопросы