Python 用decorator包装的函数的关键字参数不起作用

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 =

我在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 = 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()
函数,而不是我假设的
输出
函数。。。。。哇!