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

时间:2019-01-16 14:49:06

标签: python python-3.x default-arguments keyword-argument

我知道Python支持变量参数*args和关键字参数**kwargs,但是有没有办法为这些字段设置默认值?如果没有,为什么?

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

我并不是说我有一个用例,但似乎也没有理由禁止这样做。我确实知道通过检查空的args来解决这个问题很简单。

2 个答案:

答案 0 :(得分:2)

否,*args**kwargs是包罗万象的参数,它接收任何没有显式参数的参数。指定默认值会破坏其目的。相反,可以使用 existing 语法处理示例默认值,而无需在此处使函数定义语法复杂化。

您可以通过指定正常关键字参数来覆盖默认设置:

def foo(pos0, pos1='v', a=20, *args, **kwargs):
    pass

我用另一个关键字参数替换了(1, 'v')'默认',因为您可以使用 positional 参数为关键字参数提供值; foo(42, 'spam')会将pos1设置为'spam'

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

答案 1 :(得分:0)

您可以使用默认的kwargs并仍然用splat拆包**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设置默认值非常困难,因为其想法是使函数需要该输入。您可以从这个角度看一些技巧,例如内置range的实现。我只是将其设为kwarg