1

そこで、Google アプリ エンジン検索ライブラリの新しい Python コードを試してみたところ、奇妙な構文に遭遇しました。これは。。。でした:

cls_createDocument(**params)

params は辞書でした。

これが参照する関数は次のとおりです。

    @classmethod
  def _createDocument(
      cls, pid=None, category=None, name=None, description=None,
      category_name=None, price=None, **params)

私の質問は、 **params は何を意味し、それはオブジェクトに何をするのですか?

ありがとう!ジョン

4

2 に答える 2

7

デフォルトの引数を持つ関数を考えてみましょう:

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)

最後に、ここにドキュメントへのリンクがあります

于 2012-08-01T03:09:07.097 に答える
2

**params パラメーターは、関数に渡されるすべてのキーワード引数を辞書として表します。

于 2012-08-01T03:09:25.433 に答える