使用装饰器时函数中的默认参数

Default arguments in a function when using decorators

我真的不知道如何结合装饰器和默认参数使用 *args 和 **kwargs。让我给你一个MWE。

def outer(f):
    def inner(*args, **kwargs):
        print("args:", args)
        print("kwargs:", kwargs)

    return inner

@outer
def simple(x, y):
    pass

运行 simple 函数以不同的格式传递参数。所以:

运行:

simple(10, 20)

args: (10, 20)
kwargs: {}

运行:

simple(x=10, y=20)

args: ()
kwargs: {'x': 10, 'y': 20}

运行:

simple(10, y=20)

args: (10,)
kwargs: {'y': 20}

这一切似乎都在意料之中。我无法理解的是,如果我使用类似以下的默认值定义 simple 函数:

@outer
def simple(x, y=100):
    pass

如果我然后 运行 simple(10) 我会期望结果是:

args: (10,)
kwargs: {'y': 100}

但我明白了

args: (10,)
kwargs: {}

相反。可能是我理解的不太好,怎么才能达到预期的效果呢?

在这种情况下 **kwargs 与函数签名无关,与您如何调用它有关。 还有你的电话

simple(10)

只指定了一个位置参数。

装饰器(包装器)对函数及其默认参数一无所知。 它只是进一步传递它收到的参数。

simple(*(10,), **{})

如果你想做一些练习并编写装饰器来了解它正在包装的函数的默认值,我建议看一下 inspect.signature()