デフォルトの引数を持つ関数を考えてみましょう:
def func(foo=3):
print(foo)
引数の構造は (原則として) 辞書に非常に似ています。関数 foo には (本質的に) デフォルト引数 (この場合は ) の辞書があります{'foo':3}
。ここで、関数呼び出しでキーワードを使用したくないが、代わりに辞書を使用したいとしましょう。その場合、次のように呼び出すことができますfoo
。
d = {"foo":8}
func(**d)
これにより、関数に渡す引数を動的に変更できますfunc
。
次のことを試してみると、これはもう少し興味深いものになります。
d = {"foo":8, "bar":12}
func(**d)
これは機能しません ( と同等ですfoo(foo=8, bar=12)
が、bar
は有効な引数ではないため、失敗します)。
これらの余分な引数を の定義内に入れる場所を与えることで、この問題を回避できますfoo
。
def func( foo=3, **kwargs ):
print(foo,kwargs)
今、試してください:
d = {"foo":8, "bar":12}
func(**d) #prints (8, {'bar':12})
余分なキーワード引数はすべて、関数内の kwargs ディクショナリに入ります。
これは、次のように呼び出すこともできます。
func(foo=8, bar=12)
同じ結果で。
これは、funcA が funcB を呼び出し、funcA が funcB のすべてのキーワード (およびいくつかの余分なキーワード) を受け入れるようにする場合に役立ちます。これは、クラスと継承を扱うときに非常に一般的なことです。
def funcA(newkey=None,**kwargs):
funcB(**kwargs)
最後に、ここにドキュメントへのリンクがあります