gpt4 book ai didi

python - 如何理解python装饰器参数传递

转载 作者:行者123 更新时间:2023-11-28 21:54:34 25 4
gpt4 key购买 nike

我试着理解python装饰器

def dec(func):
def wrap(*args,**kw):
print args, kw
return func(*args,**kw)
return wrap

@dec
def myfunc(a=1,b=2,c=3):
return a+b+c


>>> myfunc()
() {}
6
>>> myfunc(1,2,3)
(1, 2, 3) {}
6
>>> myfunc(1,2,c=5)
(1, 2) {'c': 5}
8
>>>

当我运行 myfunc() 时,args 和 kw 什么都不是,但是当我运行 myfunc(1,2,3)myfunc(1,2 ,c=5),args 和 kw 被传递给 dec 函数。

据我所知,

@dec
def myfunc(...)

等于 myfunc = dec(myfunc) <-- 此处未提及任何参数。

如何将参数传递给 dec 中的 wrap 函数?如何理解这些?

最佳答案

不确定我是否正确理解了你的问题,但是 myfunc 参数的默认值只有 myfunc 知道 - 你的装饰器不知道它们,所以它不能打印它们。

这就是为什么:

myfunc()

打印结果:

() {}

*args**kw 对于装饰器来说都是空的,但是在这种情况下装饰函数将使用默认值。

在第二种和第三种情况下,你会打印出参数,因为它们被明确地传递给了装饰函数:

 def wrap(*args,**kw): <- this is what is actually called when you invoke decorated function, no default values here
print args, kw
return func(*args,**kw) <- this is the function you decorate
#if func has default parameter values, then those will be used
#when you don't pass them to the wrapper but only **inside** func
return wrap

编辑:看起来你错误地用装饰函数来调用装饰函数:

myfunc = dec(myfunc) 

使用 dec 修饰 myfunc 等同于

@dec
def myfunc(...)

另一方面,在使用其中任何一个之后:

myfunc(whatever)

调用装饰器中定义的 wrap 函数,该函数将依次调用原始的 myfunc

关于python - 如何理解python装饰器参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24039937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com