2012-03-09 34 views
1

我看到下面的代碼:Python的符號或操作 「**」

def __init__(self, fn, **kw): 
    [setattr(self,k,v) for (k,v) in kw.items()] 
    ...... 

什麼是輸入參數**kw是什麼意思?

+1

http://stackoverflow.com/questions/1769403/understanding-kwargs-in-python – San4ez 2012-03-09 18:14:11

回答

5

kw綁定到dictkeyword argument名稱映射到它們的值。

嘗試調用

def return_kwargs(**kw): 
    return kw 

return_kwargs(foo=1, bar="2", baz="hamspamspam")

+0

所以。假設班級的名字是Foo。然後我可以創建它:F =(Foo,a,b,c,d,e)。那麼kw == {b:c,d:e} ??? – 2012-03-09 18:19:03

+1

@YanZhu:不,因爲你(a)不會創建'Foo',(b)如果你的意思是'Foo(a,b,c,d,e)',它不會傳遞關鍵字參數,但值'a'到'e'。閱讀我發佈的鏈接。 – 2012-03-09 18:30:04

1

假設你有一個dict kw = {'a':1,'b':2},那麼調用myfunction(**kw)就相當於調用myfunction(a=1,b=2)

+0

這與在函數聲明中使用'** kw'相反。當然,相似性不是偶然的。 – alexis 2012-03-09 18:58:15

1

這個特殊的構造意味着構造函數的所有關鍵字參數最終都會作爲對象屬性。

foo = Foo(func, bar = 1, baz = "aa") 

這將創建一個屬性「欄」的對象設定爲1,「巴茲」到「AA」

+0

你是對的,但他只是在問'** kw'部分。屬性magic由'setattr()'完成。 – alexis 2012-03-09 18:56:52

1

功能裏面,kw是包含所有關鍵字=值參數的字典,您給你的功能:

def demo(**kw): 
    print kw 

demo(a=1, b="hello") 

運行上述,它會顯示一個字典與兩個鍵,a和b。因此,它可以用作接受您在調用函數時決定使用的任何關鍵字參數的方法。

這就是它的作用。爲什麼有人想要這樣做?也許在調用另一個函數的函數中(作爲單獨的參數給出),並且**kw將保存第二個函數的選項。