2 回答
TA贡献1829条经验 获得超9个赞
不,*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
方法来处理丢失的键。
TA贡献1815条经验 获得超6个赞
您可以使用默认值kwargs并仍然使用splatla解压缩**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
为 an 设置默认值*arg非常困难,因为其想法是使函数需要该输入。您可以在这种情况下查看一些技巧,例如range内置函数的实现。我只是让它成为一个kwarg虽然。
添加回答
举报