我了解*
和**
运营商通常如何运作。在以下代码[取自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)
的工作原理。有人可以解释一下吗?
答案 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)
它有效地建立了两个词组kwargs
和morekwargs
的联合。例如:
>>> 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
作为关键字参数提供给**
。