在Python 3.2中**kwargs和dict有什么区别?

the*_*vez 11 python syntax dictionary arguments

似乎python的许多方面只是功能的重复.除了我在Python中的kwargs和dict中看到的冗余之外还有一些区别吗?

Tad*_*eck 12

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

差异主要是:

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

  • 通过解压缩,密钥需要是有效的标识符 (4认同)

JLT*_*JLT 5

在大多数情况下,您可以交换 dicts 和 **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}
Run Code Online (Sandbox Code Playgroud)

但是,如果将 kwargs 与其他参数结合使用,则具有更大的灵活性:

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

#evaluate
>>> printer3(**my_dict)
(5, 6, {})
Run Code Online (Sandbox Code Playgroud)