微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 functools.partial 的 Python 装饰器“func”从何而来?

如何解决使用 functools.partial 的 Python 装饰器“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 作为正确的值。我要补充一点,这个代码,减去我的印刷品,是从公共源代码中获得的。在我看来,我对 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-printing-hello n 次的包装函数。这个包装器最终被分配给全局 func 名称。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。