1

「**キーワードの形式の正式なパラメータ」の目的は正確には何ですか?それがドキュメントで言及されているので、私はそれを引用符で囲みましたが、それに関する情報を見つけるのに苦労し、おそらくそれの正式な用語があると思いました。

私が理解していることから、それはユーザーが次のようなことをすることを可能にします

def foo(**keywords):
   for i in keywords:
       print(i, ":", keywords[i])

foo(val1="1", val2="2", val3="3")

出力:

val1 : 1
val2 : 2
val3 : 3

これの利点は正確には何ですか?理解を容易にするために、辞書変数を渡す方がうまくいきませんか?

4

4 に答える 4

2

辞書を使用する場合、関数の呼び出しは次のようになります。

myfunv({"key1": "value1", "key2": "value2"})

** kwargsを使用すると、これは次のようになります

myfunc(key1="value1", key2="value2")

多くの人が後者を好みます。

この構成は、引数を別の関数またはクラスに透過的に渡す場合にも非常に役立ちます。たとえば、Tkinterウィジェットをサブクラス化するときにこれをよく使用します。基本クラスのすべてのオプションをサポートしたいので、次のようにコーディングします。

class MyFrame(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        <more code here>

これにより、すべてを明示的にリストしなくても、すべて同じ引数をサポートできます。

于 2012-04-12T19:13:16.843 に答える
1

1つの用途は、パラメータを転送する場合です。例えば:

def do_some_work(kwd1=None, kwd2=None, ...):
    ....

def intermediate_function(some_other_params, **kwargs):
    ...
    do_some_work(**kwargs)

def main():
    intermediate_function(some_other_params, kwd1=5, kwd2='foo')

そうすれば、にパラメータを追加する場合、その定義とその中の呼び出しdo_some_workの両方にパラメータを追加する必要はありません。intermediate_functiondo_some_work


それが使用されるもう1つの場所は、Djangoのシグナルハンドラーです。ハンドラーを作成するときは、次の形式で作成します

def handle_signal(sender, instance, **kwargs):

これにより、APIを変更して、ユーザーがパラメーターを使用しない一連のメソッドにパラメーターを追加しなくても、将来的に追加の引数を渡すことができます。

于 2012-04-12T19:10:56.623 に答える
0

この構成を使用すると、呼び出し元は標準のキーワード引数を使用できます。

于 2012-04-12T19:08:14.923 に答える
0

歴史的に、パラメータの受け渡しは、定位置またはキーワード引数のいずれかを介して行われました。複雑なオブジェクトをパラメーターとして渡すことは比較的最近の追加であり、人々はパラメーターとして値を渡すことに慣れています。

  1. 簡単だ
  2. 読みやすさ

ここで概念を拡張し、サポートされているときに変数の位置引数とキーワード引数を渡すと、上記の構成が作成されます。

興味深いことに、コンストラクトを介して辞書を渡すことは可能ですが、責任のあるプログラマーが望まない意図はあまり明白ではなくなります。

于 2012-04-12T19:11:40.017 に答える