python调用序列中的装饰器

时间:2017-02-07 00:19:28

标签: python python-3.x

我正在尝试在python 3中编写一个装饰器,它基本上会计算函数被调用的次数。 这是我的代码:

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(x)得到一个函数返回@call_counter装饰器。 然而,这里的主要困惑是我不太明白for循环中的顺序调用是如何发生的?

那么在我们从第一次调用返回函数(在本例中为helper)之后流程是如何进行的。

现在在for循环中,succ(0),succ(1)等被调用,它是如何工作的?我们是否重用了我们从第一次调用获得的相同返回函数,或者每次将for循环加1时都会调用decorator?

1 个答案:

答案 0 :(得分: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传递给int makearg(char s[], char**args[]) { char *arg1 char arg2[50]; //I'm aware these don't assign the args pointer value to arg2. arg2[0] = args[0]; //And I'm aware this does. arg1 = (*args)[0]); }