双星号运算符如何在这里工作?

时间:2013-06-27 14:19:16

标签: python python-2.7

我了解***运营商通常如何运作。在以下代码[取自django的来源]

def curry(_curried_func, *args, **kwargs):
    def _curried(*moreargs, **morekwargs):
        return _curried_func(*(args + moreargs), **dict(kwargs, **morekwargs))
return _curried

我得到了args + moreargs部分的工作方式 - 最初传递给函数curry的[非关键字]参数,以及传递给curry返回的curried函数的参数。我没有得到的是**dict(kwargs, **morekwargs)的工作原理。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:2)

dict(kwargs, **morekwargs)是将2个词典合并为1的技巧(Guido dislikes)。

>>> d = {'foo':'bar'}
>>> kwargs = {'bar':'baz'}
>>> dict(d,**kwargs)
{'foo': 'bar', 'bar': 'baz'}

因此,curried函数将所有kwargs传递给curry并将它们添加到传递给_curried函数的其他kwargs以创建超级字典。超级字典被解压缩并发送到_curried_func

答案 1 :(得分:1)

它有效地建立了两个词组kwargsmorekwargs的联合。例如:

>>> kwargs = {"ham": 1, "spam": 2}
>>> morekwargs = {"spam": 3, "eggs": 2}
>>> dict(kwargs, **morekwargs)
{'eggs': 2, 'ham': 1, 'spam': 3}

这是有效的,因为dict构造函数接受关键字参数,因此它与

相同
>>> dict(kwargs, spam=3, eggs=2)
{'eggs': 2, 'ham': 1, 'spam': 3}

最后,生成的dict通过_curried_func作为关键字参数提供给**