The function has been called 10 times but the decorator has only been called once. Why?

时间:2018-09-18 19:44:03

标签: python-3.x python-decorators

def call_counter(func):
    print('Called\n')
    def helper(x):
        helper.calls+=1
        return func(x)
    helper.calls=0
    return helper

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

print(str(succ.calls)+'\n')
for i in range(10):
    print(succ.calls)
    succ(i)
print('\n')
print(succ.calls)

1 个答案:

答案 0 :(得分:0)

您评论了

  

我不明白为什么装饰器仅在函数上调用一次。应该叫十次吧?循环中的每次迭代都需要打印一次,因此“ Called”应被打印10次。我想念什么?

我认为您对于包装函数的运行(在代码中命名为helper)感到困惑。当装饰器传递原始函数并返回包装函数时,装饰器仅被调用一次,该函数以succ的形式存储在模块中。包装程序被循环调用十次。

运行代码时,这是我得到的输出:

Called

0

0
1
2
3
4
5
6
7
8
9


10

只有前两行(“ Called”及其后的空行)来自装饰器调用。如果仅运行函数定义而不运行循环,则可以看到此信息。即使您从未调用过该函数,也将立即看到“已调用”的字样。

顶部的零和底部的十是来自您在顶层的print语句中的。紧靠在一起打印的数字是循环的输出,该循环将在每次对包装函数进行新调用之前打印以前的调用计数。