2012-03-09 8 views
1

私は、次のコードを見た:入力引数**kwはどういう意味Pythonの表記や操作 "**"

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

を?

+1

http://stackoverflow.com/questions/1769403/understanding-kwargs-in-python – San4ez

答えて

5

kwは、dictkeyword argumentという名前の値にバインドされています。

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

def return_kwargs(**kw): 
    return kw 

を呼び出してみてください。

+0

So.クラスの名前がFooであるとします。それから私はF =(Foo、a、b、c、d、e)のように作成することができます。次に、kw == {b:c、d:e} ??? –

+1

@YanZhu:いいえ、 'Foo'を作成しない(a)、(b)' Foo(a、b、c、d、e) 'を意味するなら、キーワード引数は渡しません。値「a」から「e」まで。私が投稿したリンクを読んでください。 –

1

dict kw = {'a':1,'b':2}があるとしたら、myfunction(**kw)を呼び出すことは、myfunction(a=1,b=2)を呼び出すのと同じです。

+0

これは、関数宣言で '** kw'を使うのとは逆です。類似点はもちろん、事故ではありません。 – alexis

1

この特定の構成は、コンストラクタのすべてのキーワード引数がオブジェクト属性として終了することを意味します。

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

これは属性「バー」を持つオブジェクトを1に設定し、「バズ」を作成しますが、「AA」機能インサイド

+0

あなたは正しいですが、彼は '** kw'の部分についてしか尋ねません。属性マジックは 'setattr()'によって行われます。 – alexis

1

kwにすべてのキーワード=値の引数が含まれている辞書であること、あなた

def demo(**kw): 
    print kw 

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

上記を実行すると、aとbの2つのキーを持つ辞書が表示されます。したがって、関数を呼び出すときに使用するキーワード引数を受け入れる方法として機能します。

それはそうです。なぜ誰もそれをしたいと思いますか?おそらく、別の関数(別の引数として与えられる)を呼び出す関数で、**kwは2番目の関数のオプションを保持します。