繁体   English   中英

用装饰器包装的函数的关键字参数不起作用

[英]Keyword arguments for function wrapped with decorator not working

我在装饰器上找到的所有教程都建议在包装函数的签名中使用*args, **kwargs处理包装函数中的参数。 但是,kwarg无效,而普通args则有效:

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 print仅接受有限数量的关键字参数,而将拒绝所有其他参数。 大概您只是想看看传递了什么,因此无需打开包装即可打印原始tupledict

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)

已经使用output(arg1=99, arg2=100)调用了函数,就好像您在运行:

    print('during', arg1=99, arg2=100)

arg1arg2都不是print接受的关键字,因此它大叫您。 通过拆开包装, print等同于:

    print('during', (), {'arg1': 99, 'arg2': 100})

这是完全有效的(它直接打印tupledict ,而不是尝试解压缩)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM