不,*args并且**kwargs是接收任何没有显式参数的参数的全部参数。指定默认值违背了它们的目的。相反,您的示例默认值可以使用现有语法处理,无需在此处使函数定义语法复杂化。您可以通过指定普通关键字参数来覆盖默认值:def foo(pos0, pos1='v', a=20, *args, **kwargs):
pass我(1, 'v')用另一个关键字参数替换了您的“默认”,因为您可以使用位置参数为关键字参数提供值;foo(42, 'spam')将设置pos1为'spam'.此外,您始终可以在您定义的函数内部进行进一步处理;该args值是一个元组,只需测试长度以检查是否需要对缺失值使用默认值。kwargs是字典,只需使用kwargs.get(key, default)或kwargs.pop(key, default)或if key not in kwargs:或任何其他dict方法来处理丢失的键。
您可以使用默认值kwargs并仍然使用splatla解压缩**kwargsdef john(name, dog, *args, bob="bob", **kwargs): print(name, dog, bob)# "ream" is an unpacked argjohn("john", 1, "ream") # john 1 bob# jane is an unpacked kwargjohn("john", 1, "ream", jane="jane") # john 1 bobjohn("john", 1, "ream", bob="jane") # john 1 jane为 an 设置默认值*arg非常困难,因为其想法是使函数需要该输入。您可以在这种情况下查看一些技巧,例如range内置函数的实现。我只是让它成为一个kwarg虽然。