2012-05-08 15 views
10

Pythonの多くの側面は単に機能の重複しているようです。 Pythonでkwargsとdictで見ている冗長性を超えて、いくつかの違いがありますか?Python 3.2の** kwargsとdictの違いは何ですか?

+4

'** kwargs'は、暗黙的に(*' dict'オブジェクトを作成しますキーと値がロードされた '' kwargs'')これは重複した機能ではありません。 –

+0

「多くの側面」で展開します。重複する機能の他の領域は何ですか? – jdi

答えて

8

引数の違い開梱(多くの人がkwargsを使用する場合)および引数の1つとしてdictを渡すことがあります:引数のアンパックを使用して

  • は:

    辞書を渡す
    # Prepare function 
    def test(**kwargs): 
        return kwargs 
    
    # Invoke function 
    >>> test(a=10, b=20) 
    {'a':10,'b':20} 
    
  • として引数:

    # Prepare function 
    def test(my_dict): 
        return my_dict 
    
    # Invoke function 
    >>> test(dict(a=10, b=20)) 
    {'a':10,'b':20} 
    

違いは、主に以下のとおりです。

  • 可読性(これらは明示的に定義されていない場合でも、あなたは、単にキーワード引数を渡すことができます)、
  • 柔軟性(明示的にいくつかのキーワード引数をサポートして**kwargsを使用して、残りすることができます) 、
  • 引数アンパックは、あなたが(一般的にはPythonは、開発者は別のトピックである、彼らは何をしているか知っていると仮定して、あまり重要でない)引数を「含む」オブジェクトへの予期しない変更を避けることができます
+4

アンパックすると、キーは有効な識別子である必要があります –

+0

@gnibbler:あなたは正しいです、+1。私はそれを完全に逃した。例として、{(0:10、 '0':20}) '(' {0:10、 '0':20} 'を返す)' 'test 'を与えて、引数を解凍するのは難しい。 – Tadeck

3

ほとんどの場合、dictsと** kwargsだけを交換できます。例えば

my_dict = {'a': 5, 'b': 6} 
def printer1(adict): 
    return adict 
def printer2(**kwargs): 
    return kwargs 

#evaluate: 
>>> printer1(my_dict) 
{'a': 5, 'b': 6} 
>>> printer2(**my_dict) 
{'a': 5, 'b': 6} 

は、しかし、あなたが他の引数とそれを組み合わせる場合は、より多くの柔軟性を持っているkwargsからで:

def printer3(a, b=0, **kwargs): 
    return a,b,kwargs 

#evaluate 
>>> printer3(**my_dict) 
(5, 6, {}) 
関連する問題