为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪9158850 2021-10-12 16:17:11
我知道 Python 支持可变参数*args和关键字参数,**kwargs但是有没有办法为这些字段设置默认值?如果不是,为什么?*args = (1,'v')) , **kwargs = {'a':20}我并不是说我有一个用例,但似乎也没有理由禁止这样做。我确实理解通过检查 empty 来解决这个问题是微不足道的args。
查看完整描述

2 回答

?
PIPIONE

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方法来处理丢失的键。


查看完整回答
反对 回复 2021-10-12
?
红糖糍粑

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虽然。


查看完整回答
反对 回复 2021-10-12
  • 2 回答
  • 0 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信