我正试图在Python 3(Python 3.7.0)中使用args
和kwargs
来解决这个问题但是我的理解遇到了一些问题。
这是一个简单的函数:
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语句的方法?
*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))
嗯,y
是函数定义中的第一个位置参数,所以它自然会绑定到callsite上的第一个实际位置参数,即1。