2016-10-06 9 views
0

私はPythonで* argsと** kwargsを試していました。しかし、私はその理由を理解できないというエラーが出ます。** kwargs in Python

def new(a,b,c): 
    print a,b,c 

a={'a': 7, 'b': 8, 'c': 9} 
b={'1':7, '2':8, '3':9} 

new(**a) 
new(**b) 

新しい(** a)は、期待どおりの結果、つまりキー7,8,9を印刷します。 しかし、新しいは(** b)はエラーを与える:

new(**b) 
TypeError: new() got an unexpected keyword argument '1' 

誰もがこれを説明してもらえますか?どちらの場合でも文字列を引数として渡していますが、 'a'の作品と '1'はありません。

+0

変数をすることはできません数字は、あなたの辞書のキーが1で始まらないことを意味します。 – Nicarus

+2

'new(** a)'が本質的に 'new(a = 7、b = 8、c = 9) 'という事実を考えるなら、おそらくそれがうまくいかない理由を理解できます。 – SethMMorton

+0

@Nicarusここには2つの問題があります。それは間違いなく1つですが、それはPythonがエラーとして提起するものではありません。 – SethMMorton

答えて

1

理由は簡単です。辞書をPython関数にkwargsとして渡すと、それが展開され、辞書のキーが変数名として使用されます。**関数パラメータリストで指定したパラメータ名のみを使用できます。辞書は、関数呼び出し、fun(**data)であなたを開梱ん辞書data={"key1":val1, "key2":val2, ..., "keyn":valn}ため

+1

私は、OPが数字を使用するだけではないことを明確にしたいと思います。 「d」、「e」、「f」のキーを使用しようとすると、これは失敗します。 – SethMMorton

+0

私の答えを見てください - あなた* can *数字 'kwargs' –

+0

実際に@LegoStormtroopr、私は**キー**を参照しています**値**ではありません。ユーザーは実際には数字のキー**を送信しませんでした**しかし、数字の刺す。 – RFVenter

0

は、限り、あなたの関数は、引数のキー1、...、keynを持っていた、および/またはキーワード引数を受け入れるようfun(key1=val1, key2=val2,..., keyn=valn)と、この意志の成功をしていることと同じです。

のでnew(**b)の問題は、それが機能だけので、エラー、a名前付き引数、b、およびcを持っていたとして、ナンセンスであるnew(1=7,2=8,3=9)をやろうとしているです。

あなたのために、あなたの第二の例ではなく、また

b=[7,8,9] 
new(*b) 

は、あなたがこの機能インスタンス

test(1,23,42) 
test(w=3,r="buu") 
test(1,2,3,q=23,ans=42) 
a=[143,56,76] 
b={'a': 7, 'b': 8, 'c': 9} 
test(*a,**b) 
0

This is related to a similar questionのためのような

def test(*argv, **kwarg): 
    print "positional arguments", argv 
    print "key word arguments", kwarg 

で遊ぶしたい場合があり、リストにしてみてください、しかし短い方法で**kwargsを渡す方法は、 k ey w ord argの辞書に含まれます。 a,b,cので、あなたはそれが必見キーとして、これらの値を持っているkwargs辞書に渡した場合 - あなたの試みが失敗し

の理由は、あなたの方法新しい定義3つの名前付き引数があることです。

def foo(**kwargs): 
    print kwargs 

a={'a': 7, 'b': 8, 'c': 9} 
b={'1':7, '2':8, '3':9} 

foo(**a) 
foo(**b) 

与える:

その重要なのは、あなたがまたはキャッチあなたがそうのように、数値引数を持つメソッドを呼び出すことができるようにする方法でkwargsができることに注意することは

{'a': 7, 'c': 9, 'b': 8} 
{'1': 7, '3': 9, '2': 8}