0

簡単なタプル、辞書、関数を作成しましょう。

>>> tup = (7, 3)
>>> dic = {"kw1":7, "kw2":3}
>>> def pr(a, b):
...    print a, b

以下は*、引数としてタプルと辞書の前に何をするかを示しています。

>>> pr(tup)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pr() takes exactly 2 arguments (1 given)

>>> pr(*tup)  
7 3   

>>> pr(*dic)
kw1 kw2

**では、引数の前に試してみましょう。

>>> pr(**tup)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pr() argument after ** must be a mapping, not tuple

わかりました、** 辞書が引数として使用されている場合にのみ機能するようです。それでは、辞書を引いてみましょう。

>>> pr(**dic)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: pr() got an unexpected keyword argument 'kw1'

何?エラーを生成しないこの最後のケースの例を誰かに見せてもらえますか?

4

3 に答える 3

3

他の回答に追加するには、関数定義に*argsandを使用して、任意の引数をサポートできます。**kwargsこれにより、コードの明示性が低下する場合があります。しかし、デバッグ目的、柔軟性、および開発速度のために、これを採用することは理にかなっているかもしれません:

(関数定義の*/**表記は、関数呼び出しでの引数アンパック操作の「逆」操作のようなものです。)

def foo(*args, **kwargs): 
    for v in args: 
        print v
    for v in kwargs: 
        print v, "->", kwargs[v]

dic = {"kw1":7, "kw2":3}

foo(dic)
# prints:
# {'kw1': 7, 'kw2': 3}

foo(**dic)
# prints:
# kw1 -> 7
# kw2 -> 3

ドキュメントへの関連リンク:

于 2012-06-25T09:54:25.260 に答える
2

この**dict表記は、辞書がキーワード引数に変換されることを意味します。関数が必要なキーワードを持っていない場合、経験したようにエラーが返されます。

あなたの場合、関数次のように定義すると機能します。

>>> def pr(kw1, kw2):
...    print kw1, kw2
于 2012-06-25T09:43:47.103 に答える
2

関数は、 andではなくandprを引数に取ります。abkw1kw2

>>> def pr(a, b):
...   print a, b
... 
>>> 
>>> d = {'a': 1, 'b':2}
>>> pr(**d)
1 2
于 2012-06-25T09:44:13.063 に答える