我正在尝试在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?
答案 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]);
}
。