2010-12-07 7 views
4

メソッドシグネチャに** kwargsとキーワード引数を組み合わせて使用​​することはできますか?メソッドシグネチャに** kwargsとキーワード引数を組み合わせて使用​​する

>>> def f(arg, kw=[123], *args, **kwargs): 
... print arg 
... print kw 
... print args 
... print kwargs 
... 
>>> f(5, 'a', 'b', 'c', kw=['abc'], kw2='def') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: f() got multiple values for keyword argument 'kw' 

あなたが二回キロワットを割り当てている

+0

-1:悪い例。 @ Falmarriの答えを見てください。 –

+1

質問を読めば、私は明らかに良い例はありません。 – explodes

+0

@ S.Lott悪い例は、ダウンボートの理由ではありません。 OPが完全に話題を完全に理解していれば、彼は尋ねる必要はありません。 –

答えて

9

...役に立たないようだが、多分誰かがそれのための素晴らしいトリックを発見しました。

このコールでは、f(5, 'a', 'b', 'c', kw=['abc'], kw2='def')、arg = 5、kw = 'a'、* args =( 'b'、 'c')、次にkwを再度割り当てようとしています。

+0

+1:例が悪いです。 –

12

Python 3では、キーワードのみの引数(PEP 3102)を使用できます。 「あなたができるのPython 2では

>>> def f(arg, *args, kw=[123], **kwargs): 
... print(arg) 
... print(kw) 
... print(args) 
... print(kwargs) 
>>> f(5, 'a', 'b', 'c', kw=['abc'], kw2='def') 
5 
('a', 'b', 'c') 
['abc'] 
{'kw2': 'def'} 

(私は引数の順番を変えながら、私はprint sのオーダーを変更していないことに注意してください。)

:これらを使用すると、あなたの関数は次のようになります。 varargs引数の後ろにキーワード引数がありますが、Python 3では可能です。その引数はキーワードのみになります。

また、putting mutable objects as default parametersに注意してください。

+0

これは著者が探していたものなのかどうかわかりませんが、それは私が知る必要があったものです。ありがとうございました。 – KobeJohn

関連する問題