gpt4 book ai didi

**kwargs 中的 Python 装饰器 TypeError

转载 作者:行者123 更新时间:2023-12-01 07:18:13 24 4
gpt4 key购买 nike

我正在尝试深入了解Python装饰器

def lol(func):
def wrapper(*args,**kwargs):
print(*args)
print(**kwargs)
return func(*args,**kwargs)
return wrapper

@lol
def greet(name,lol,l):
return f'{name}:{lol}:{l}'

greet('tom',"dick",l="harry")

所以,当我只给出像 greet('tom',"dick","harry") 这样的位置参数时,这个函数就可以工作,但是当我给出关键字参数后跟位置参数时 greet( 'tom',"dick",l="harry") 它给了我错误。

TypeError: 'l' is an invalid keyword argument for this function

但是当我像这样重写我的装饰器时

def lol(func):
def wrapper(*args,**kwargs):
print(*args)
print(**kwargs)
return wrapper(*args,**kwargs)
return func

效果很好。我对发生的事情有点困惑。如果有人能解释一下,无论原因多么愚蠢,那就太好了。谢谢。

最佳答案

你不想做的事:

    print(**kwargs)

尝试将关键字参数扩展为 print 的关键字参数,因此在您的用例中,就像您键入 print(l="harry") 一样,显然是无意义的(print 不接受名为 l 的参数)。只要这样做:

    print(kwargs)

查看收到的关键字参数的dict。同样,print(args) 可能是比 print(*args) 更好的解决方案,因为它会打印 repr,这通常表明您可以更多地了解用于调试目的的参数。

你的第二种方法“工作正常”的原因是它不装饰任何东西。你制作wrapper,扔掉它,然后返回原始func,因此调用原始func,并且print(** kwargs) 永远不会发生。

关于**kwargs 中的 Python 装饰器 TypeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57842950/

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