【问题标题】:What is the difference between **kwargs and dict in Python 3.2?Python 3.2 中的 **kwargs 和 dict 有什么区别?
【发布时间】:2012-05-16 11:44:06
【问题描述】:

似乎 python 的许多方面只是功能的重复。除了我在 Python 中的 kwargs 和 dict 中看到的冗余之外,还有什么不同吗?

【问题讨论】:

  • **kwargs 隐式创建 a dict 对象(由 kwargs 命名)加载了键和值。这不是重复的功能。
  • 扩展“多方面”。还有哪些领域是重复功能?

标签: python syntax dictionary arguments


【解决方案1】:

参数解包(许多人使用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 通常假定开发人员知道他们在做什么,这是一个不同的主题),

【讨论】:

  • 解压后,密钥必须是有效标识符
  • @gnibbler:你是对的,+1。我完全错过了。作为一个例子,我会给test({0: 10, '0': 20})(它将返回{0: 10, '0': 20}),这很难用参数解包来代替。
【解决方案2】:

在大多数情况下,您可以互换 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}

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

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

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

【讨论】:

    猜你喜欢
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    相关资源
    最近更新 更多