Python是否支持默认关键字和默认可变长度参数?

Python是否支持默认关键字和默认可变长度参数?,python,python-3.x,default-arguments,keyword-argument,Python,Python 3.x,Default Arguments,Keyword Argument,我知道Python支持变量参数*args和关键字参数**kwargs,但是有没有办法为这些字段设置默认值?若否,原因为何 *args = (1,'v')) , **kwargs = {'a':20} 我并不是说我对此有一个用例,但似乎也没有理由不允许这样做。我知道通过检查空的参数来解决这个问题是很简单的,你可以使用默认的kwargs并且仍然使用splata la**kwargs def john(name, dog, *args, bob="bob", **kwargs): print(n

我知道Python支持变量参数
*args
和关键字参数
**kwargs
,但是有没有办法为这些字段设置默认值?若否,原因为何

*args = (1,'v')) , **kwargs = {'a':20}

我并不是说我对此有一个用例,但似乎也没有理由不允许这样做。我知道通过检查空的
参数来解决这个问题是很简单的,你可以使用默认的
kwargs
并且仍然使用
splat
a la
**kwargs

def john(name, dog, *args, bob="bob", **kwargs):
  print(name, dog, bob)

# "ream" is an unpacked arg
john("john", 1, "ream") # john 1 bob

# jane is an unpacked kwarg
john("john", 1, "ream", jane="jane") # john 1 bob

john("john", 1, "ream", bob="jane") # john 1 jane

*arg
设置默认值非常困难,因为这样做的目的是使函数需要该输入。在
范围
内置的实现中,您可以看到一些技巧。不过,我只想把它设为一个
kwarg

不,
*args
**kwargs
是接收没有显式参数的所有参数的catch-all参数。指定默认值违背了它们的目的。相反,您的示例默认值可以使用现有语法处理,这里不需要使函数定义语法复杂化

您可以通过指定普通关键字参数来覆盖默认值:

我用另一个关键字参数替换了
(1,'v')
“default”,因为您可以使用位置参数为关键字参数提供值
foo(42,'spam')
pos1
设置为
'spam'


此外,您始终可以在定义的函数内进行进一步处理;
args
值是一个元组,只需测试长度即可检查是否需要为缺少的值使用默认值
kwargs
是一个字典,只需使用
kwargs.get(key,default)
kwargs.pop(key,default)
如果key不在kwargs:
或任何其他
dict
方法来处理缺少的键

不,它不是。“没有理由不允许这样做”更像是“没有足够的需求来实现它”。我同意,但我不认为实现它有那么难,但我还是想不出一个可以提交pep的用例说明(带有示例实现)如果您愿意在下一个python版本@Idlehands中使用这一点:不仅没有需求,也没有必要,现有语法涵盖了这里描述的用例。
def foo(pos0, pos1='v', a=20, *args, **kwargs):
    pass