Python 3.2中**kwargs和dict的区别是什么?

18

看起来 Python 的许多方面只是功能的复制。除了在 Python 中看到的 kwargs 和 dict 的冗余之外,是否存在其他区别?


6
**kwargs 隐式地创建了一个名为 kwargsdict 对象,并填充了键和值。这不是重复的功能。 - user166390
可以详细说明一下“许多方面”吗?还有哪些领域存在重复功能? - jdi
2个回答

20

在参数解包(许多人使用kwargs)和将dict作为参数之一传递时存在差异:

  • 使用参数解包:

    # Prepare function
    def test(**kwargs):
        return kwargs
    
    # Invoke function
    >>> test(a=10, b=20)
    {'a':10,'b':20}
    
    传递字典作为参数:
    # Prepare function
    def test(my_dict):
        return my_dict
    
    # Invoke function
    >>> test(dict(a=10, b=20))
    {'a':10,'b':20}
    

区别大致为:

  • 可读性(即使没有明确定义,您也可以简单地传递关键字参数),
  • 灵活性(您可以显式支持某些关键字参数,而使用 **kwargs 支持其余参数),
  • 参数解包可帮助您避免对“包含”参数的对象造成意外更改(这也不太重要,因为Python通常假定开发人员知道他们正在做什么,这是一个不同的主题),

5
使用解包时,键必须是有效的标识符。 - John La Rooy
@gnibbler:你说得对,+1。我完全没注意到。举个例子,我会给出test({0: 10, '0': 20})(它将返回{0: 10, '0': 20}),这很难用参数解包来替换。 - Tadeck

6

在大多数情况下,您可以直接交换字典和 **kwargs。

例如:

my_dict = {'a': 5, 'b': 6}
def printer1(adict):
    return adict
def printer2(**kwargs):
    return kwargs

#evaluate:
>>> printer1(my_dict)
{'a': 5, 'b': 6}
>>> printer2(**my_dict)
{'a': 5, 'b': 6}

但是使用kwargs,如果将其与其他参数结合使用,您将拥有更多的灵活性:

def printer3(a, b=0, **kwargs):
    return a,b,kwargs

#evaluate
>>> printer3(**my_dict)
(5, 6, {})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接