Python で **kwargs を使用する理由は何ですか? 名前付き引数を使用する場合と比べて、実際の利点は何ですか? 質問する

Python で **kwargs を使用する理由は何ですか? 名前付き引数を使用する場合と比べて、実際の利点は何ですか? 質問する

私は静的言語のバックグラウンドを持っています。誰か(できれば例を挙げて)現実世界を説明できますか?名前付き引数よりも**kwargsを使用する利点?

私にとっては、関数呼び出しがより曖昧になるだけのように思えます。ありがとうございます。

ベストアンサー1

さまざまな理由から、ほぼ任意の名前付き引数を受け入れる必要がある場合があります。これは、フォームで**kw実行できることです。

最も一般的な理由は、引数をラップしている他の関数に直接渡すことです (デコレータはこれに該当するケースの 1 つですが、唯一のケースではありません)。この場合、**kwラッパーはラッパー対象の引数をすべて認識したり気にしたりする必要がないため、ラッパーとラッパー対象の間の結合が緩くなります。次に、まったく異なる別の理由を示します。

d = dict(a=1, b=2, c=3, d=4)

すべての名前を事前に知っておく必要がある場合、明らかにこのアプローチは存在し得ませんよね? ちなみに、適用可能な場合は、キーがリテラル文字列である辞書を作成するこの方法の方が、次の方法よりもはるかに好ましいです:

d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

後者は句読点が多く、読みにくくなるからです。

受け入れるべき優れた理由がどれも当てはまらない場合は**kwargs、受け入れないでください。それだけです。つまり、呼び出し元が任意の名前を持つ追加の名前付き引数を渡すことを許可すべき正当な理由がない場合は、それを許可しないでください。**kwステートメント内の関数のシグネチャの最後にフォームを配置しないようにするだけですdef

はどうかと言うと使用して **kw呼び出しでは、単一の呼び出しポイントとは独立して、それぞれ対応する値を持つ、渡す必要のある名前付き引数の正確なセットを辞書にまとめ、その辞書を単一の呼び出しポイントで使用できます。比較:

if x: kw['x'] = x
if y: kw['y'] = y
f(**kw)

に:

if x:
  if y:
    f(x=x, y=y)
  else:
    f(x=x)
else:
  if y:
    f(y=y)
  else:
    f()

可能性が 2 つだけ (しかも非常に単純な種類!) あったとしても、 の欠如により、**kw2 番目のオプションはすでにまったく支持できず、耐えられないものになっています。可能性が 6 つある場合、おそらく相互作用が少し豊かになるとどうなるか想像してみてください... がなければ**kw、そのような状況下では人生はまさに地獄でしょう。

おすすめ記事