Python 用decorator包装的函数的关键字参数不起作用
我在decorators上找到的所有教程都建议在包装函数的签名中使用Python 用decorator包装的函数的关键字参数不起作用,python,Python,我在decorators上找到的所有教程都建议在包装函数的签名中使用*args、**kwargs,来处理包装函数的参数。但是Kwarg不起作用,而普通arg是: from functools import wraps def wrapper(a_thing): @wraps(a_thing) def do_thing(*args, **kwargs): print('before') print(kwargs) value =
*args、**kwargs
,来处理包装函数的参数。但是Kwarg不起作用,而普通arg是:
from functools import wraps
def wrapper(a_thing):
@wraps(a_thing)
def do_thing(*args, **kwargs):
print('before')
print(kwargs)
value = a_thing(*args, **kwargs)
print("after", *args, **kwargs)
return value
return do_thing
@wrapper
def output(*args, **kwargs):
print('during', *args, **kwargs)
import pdb; pdb.set_trace()
以下是我的交互式输出:
(Pdb) output(99, 100)
before
{}
during 99 100
after 99 100
(Pdb) output(arg1=99, arg2=100)
before
{'arg1': 99, 'arg2': 100}
*** TypeError: 'arg1' is an invalid keyword argument for this function
(Pdb)
以下是众多此类教程之一:
如果**kwargs不起作用,使用它有什么意义?我觉得我遗漏了什么。您不想在调用
print
时解包print
只接受有限数量的关键字参数,并将拒绝所有其他参数。大概您只是想查看传递的内容,所以打印原始元组
和dict
,而无需解压缩:
def wrapper(a_thing):
@wraps(a_thing)
def do_thing(*args, **kwargs):
print('before')
print(kwargs)
value = a_thing(*args, **kwargs)
print("after", args, kwargs) # Removed unpacking
return value
return do_thing
@wrapper
def output(*args, **kwargs):
print('during', args, kwargs) # Removed unpacking
解包的要点是,它将*
解包iterable的元素作为顺序位置参数传递,将**
解包映射中的键值对作为关键字参数传递,并将值作为关联值传递。所以当你这么做的时候:
print('during', *args, **kwargs)
调用带有输出(arg1=99,arg2=100)
的函数后,就好像运行了:
print('during', arg1=99, arg2=100)
无论是arg1
还是arg2
都不是print
所接受的关键字,因此它会向您发出尖叫。拆下拆包后,打印
相当于:
print('during', (), {'arg1': 99, 'arg2': 100})
这是非常有效的(它直接打印元组
和dict
,而不是试图解包)。啊,谢谢,错误中提到的“函数”是print()
函数,而不是我假设的输出
函数。。。。。哇!