2013-06-27 19 views
0

據我所知,***運營商通常如何工作。在下面的代碼[從Django的源採取]double asterik操作符在這裏如何工作?

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

我得到的args + moreargs部分如何工作 - 在[非 - 關鍵字]參數最初傳遞給函數curry並傳遞給咖喱函數的參數通過curry退換結合。我沒有得到的是**dict(kwargs, **morekwargs)是如何工作的。有人可以解釋一下嗎?

+1

你看過這個嗎? http://stackoverflow.com/questions/2921847/python-once-and-for-all-what-does-the-star-operator-mean-in-python –

+1

@limelights我剛纔讀了它。正如我在我的文章中提到的,我理解[希望:)] **操作符的工作原理。我懷疑是**字典(kwargs,** morekwargs)'的一部分。 – ersran9

+0

是的,我完全誤解了它,但是讓它保持良好的供參考。對於那個很抱歉! –

回答

2

dict(kwargs, **morekwargs)是一招(即圭多dislikes),用於組合2個字典到1

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

所以,咖喱函數需要傳遞給curry所有kwargs並將它們添加到傳遞給_curried功能的附加kwargs創建一個超級字典。該超級字典被解壓併發送到_curried_func

+1

「Guido不喜歡」部分參考:http://mail.python.org/pipermail/python-dev/2010-April/099459.html – Aya

+0

@Aya - 重新閱讀後,也許「不喜歡」足夠強大... :)。感謝您的參考。 – mgilson

+0

@mgilson謝謝你,親自發現dict.update方法在眼睛上更容易:) – ersran9

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