如何使用* args返回默认值,并在函数签名中复制** kwargs [duplicate]

问题描述 投票:-1回答:2

我正试图在Python 3(Python 3.7.0)中使用argskwargs来解决这个问题但是我的理解遇到了一些问题。

这是一个简单的函数:

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在第一份印刷声明中发生了什么?我可以看到它被1args覆盖了,但我不确定为什么。

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

我试过看herehere但没找到我想要的答案。因为我认为在argskwargs之前设置默认值会阻止覆盖。

python python-3.x function args kwargs
2个回答
2
投票

*args只捕获任何未定义的位置参数; y=10并不意味着y不能用作位置论证。所以y被赋予第一个位置参数。

你可以通过使它成为y来阻止keyword-only argument被用作位置参数。你可以通过在*args var -position 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关键字catch-all:

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

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

仅关键字参数不必具有默认值,可以省略=10,但是参数必须是必需的,并且只能通过使用y=value在调用中指定:

>>> 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))

2
投票

嗯,y是函数定义中的第一个位置参数,所以它自然会绑定到callsite上的第一个实际位置参数,即1。

© www.soinside.com 2019 - 2024. All rights reserved.