gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:29:08 24 4
gpt4 key购买 nike

当结合装饰器和默认参数时,我真的不知道如何使用 *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() .

关于python - 使用装饰器时函数中的默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71082545/

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