Python decorators using functools.partial.."func"从何而来?



给定以下python代码。。。

from functools import partial
def run_n( func = None, count = 1 ):
print( "func", func )
print( "count", count )
if func is None:
return partial( run_n, count = count )
def wrapper():
for _ in range( count ):
func()
return wrapper
@run_n( count = 2 )
def func():
print( "Hello" )
func()

我得到以下输出。。

func None
count 2
func <function func at 0x7f6b45572ca0>
count 2
Hello
Hello

我的问题是,假设run_n装饰器的第一次调用具有funcNone,那么第二次调用如何获取func作为正确的值。我要补充的是,除了我的指纹外,这段代码是从公共源代码中获得的。在我看来,我对partial是如何工作的缺乏了解,但我仍然看不出func是如何突然获得价值的。

首先,使用func=Nonen=2调用run_n。由于funcNone,它将占用if语句的第一个分支。partial然后创建并返回一个匿名函数,该函数的行为就像它是这样定义的:

def anonymous(*args, **kwargs):
return run_n(*args, count=2, **kwargs)

然后函数被调用,并将被定义的函数(即打印"hello"的函数(作为其第一个参数。这会立即调用

run_n(<func-printing-hello>,count=2)

这一次,run_n被赋予了一个func参数,并返回包装器函数,该函数调用func打印hello n次。最终,这个包装器被分配给全局func名称。

最新更新