\*\*kwargs 的目的和用途是什么?

新手上路,请多包涵

**kwargs 在Python中有什么用途?

我知道你可以在桌子上做一个 objects.filter 并传入一个 **kwargs 参数。

我也可以这样做来指定时间增量,即 timedelta(hours = time1) 吗?

它究竟是如何工作的?它被归类为“拆包”吗?比如 a,b=1,2

原文由 Federer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 547
2 个回答

您可以使用 **kwargs 让您的函数采用任意数量的关键字参数(“kwargs”表示“关键字参数”):

 >>> def print_keyword_args(**kwargs):
...     # kwargs is a dict of the keyword args passed to the function
...     for key, value in kwargs.iteritems():
...         print "%s = %s" % (key, value)
...
>>> print_keyword_args(first_name="John", last_name="Doe")
first_name = John
last_name = Doe

您还可以在调用函数时使用 **kwargs 语法,方法是构造关键字参数字典并将其传递给函数:

 >>> kwargs = {'first_name': 'Bobby', 'last_name': 'Smith'}
>>> print_keyword_args(**kwargs)
first_name = Bobby
last_name = Smith

Python 教程 包含了一个很好的解释它是如何工作的,以及一些很好的例子。

Python 3 更新

对于 Python 3,而不是 iteritems() ,使用 items()

原文由 Pär Wieslander 发布,翻译遵循 CC BY-SA 4.0 许可协议

解压字典

** 字典。

这个

func(a=1, b=2, c=3)

是相同的

args = {'a': 1, 'b': 2, 'c':3}
func(**args)

如果您必须构造参数,这很有用:

 args = {'name': person.name}
if hasattr(person, "address"):
    args["address"] = person.address
func(**args)  # either expanded to func(name=person.name) or
              #                    func(name=person.name, address=person.address)


函数的打包参数

  • 使用 .items() 而不是 .iteritems() 用于 python 3
 def setstyle(**styles):
    for key, value in styles.iteritems():      # styles is a regular dictionary
        setattr(someobject, key, value)

这使您可以像这样使用该功能:

 setstyle(color="red", bold=False)


笔记

  • kwargs 是用于关键字参数的变量名,可以使用另一个变量名。重要的部分是它是一本字典,它是用双星号运算符 ** 解压的。
  • 其他可迭代对象使用单个星号运算符解包 *
  • 为防止混淆,最好坚持使用已识别的变量名称 kwargsargs ,分别用于字典和其他可迭代对象。

资源

原文由 Georg Schölly 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题