python - 如何在函数签名中使用 *args 和 **kwargs 返回默认值

标签 python python-3.x function args keyword-argument

我正在尝试使用 args 来解决问题和kwargs在 Python 3 (Python 3.7.0) 中,但我的理解遇到了一些问题。

这是我的一个简单函数:

def add_args(y=10, *args, **kwargs):
    return y, args, kwargs

并测试它以查看返回的内容:

    print(add_args(1, 5, 10, 20, 50))
    print(add_args())
    >>
    (1, (5, 10, 20, 50), {}) # What happened to my default y=10?
    (10, (), {})

我不明白的是,y=10 发生了什么?在第一个打印语句中?我可以看到它被 1 覆盖在args但我不确定为什么。

如何重写此函数,以便不覆盖默认值,或者我是否遗漏了参数从函数签名传递到 return 语句的方式?

我尝试查找herehere但没有找到我正在寻找的答案。正如我所想的,将默认值放在 args 之前和kwargs会阻止覆盖。

最佳答案

*args 仅捕获任何未另行定义的位置参数; y=10 并不意味着 y 不能用作位置参数。因此,y 被分配给第一个位置参数。

您可以通过将 y 设置为 keyword-only argument 来防止将其用作位置参数。 。您可以通过将参数放在 *args var-positional catch-all 参数之后来实现此目的,或者如果您没有 *name参数,在*单个星号之后:

def add_args(*args, y=10, **kwargs):
    return y, args, kwargs

def keyword_only_args(*, y=10, **kwargs):
    return y, kwargs

现在 y 将不再捕获位置参数:

>>> def add_args(*args, y=10, **kwargs):
...     return y, args, kwargs
...
>>> add_args(1, 5, 10, 20, 50)
(10, (1, 5, 10, 20, 50), {})          # y is still 10
>>> add_args(1, 5, 10, 20, 50, y=42)  # setting y explicitly 
(42, (1, 5, 10, 20, 50), {})

您也不必使用 **kwargs 关键字来包罗万象:

def add_args(*args, y=10):
    return y, args

但如果存在,则需要将其列在最后。

仅关键字参数不必具有默认值,可以省略 =10,但随后该参数将变为强制参数,并且只能在调用中使用 指定y=值:

>>> def add_args(*args, y):  # mandatory keyword-only argument
...     return y, args
...
>>> add_args(1, 5, 10, 20, 50)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: add_args() missing 1 required keyword-only argument: 'y'
>>> add_args(1, 5, 10, 20, 50, y=42)
(42, (1, 5, 10, 20, 50))

关于python - 如何在函数签名中使用 *args 和 **kwargs 返回默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52477488/

相关文章:

javascript - String.concat() 如何在 javascript 中实现?

python - Keras 精度不变

python-3.x - 制作不同颜色的线图标记

python - 如何让 Discord 机器人删除用户对 discord.py 中消息的 react ?

python将项目添加到列表并在获得空值时停止

javascript - jQuery 插件函数覆盖

python - 如何在 Python 中检查 wget/urllib2 的结果?

python - 如何计算高分辨率图像之间的匹配特征?

python - 在字符串列表中的最后一项之前添加 'and'

c++ - 对于相对较新的计算机,有什么替代OL'C++ Beep()的好方法?