Python 装饰器使用 functools.partial.. "func" 来自哪里?
Python decorators using functools.partial.. Where does "func" come from?
给定以下 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
装饰器有func
None,第二次调用如何获取func
作为正确的值。我要补充一点,这段代码(减去我的印刷品)是从 public 源代码中获取的。在我看来,我对 partial
的工作原理缺乏了解,但我仍然看不到 func
是如何突然获取一个值的。
首先,run_n 被 func=None
和 n=2
调用。由于 func
是 None
,它将采用 if 语句的第一个分支。 partial
然后创建和 returns 一个匿名函数,其行为就好像它是这样定义的:
def anonymous(*args, **kwargs):
return run_n(*args, count=2, **kwargs)
然后 that 函数被调用,函数被定义(即函数打印“hello”)作为它的第一个参数。这会立即调用
run_n(<func-printing-hello>,count=2)
这一次,run_n
被赋予了一个 func
参数,returns 调用 func-printing-hello n 次的包装函数。最终,这个包装器被分配给全局 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
装饰器有func
None,第二次调用如何获取func
作为正确的值。我要补充一点,这段代码(减去我的印刷品)是从 public 源代码中获取的。在我看来,我对 partial
的工作原理缺乏了解,但我仍然看不到 func
是如何突然获取一个值的。
首先,run_n 被 func=None
和 n=2
调用。由于 func
是 None
,它将采用 if 语句的第一个分支。 partial
然后创建和 returns 一个匿名函数,其行为就好像它是这样定义的:
def anonymous(*args, **kwargs):
return run_n(*args, count=2, **kwargs)
然后 that 函数被调用,函数被定义(即函数打印“hello”)作为它的第一个参数。这会立即调用
run_n(<func-printing-hello>,count=2)
这一次,run_n
被赋予了一个 func
参数,returns 调用 func-printing-hello n 次的包装函数。最终,这个包装器被分配给全局 func
名称。