2012-05-08 56 views
10

Wygląda na to, że wiele aspektów Pythona to tylko duplikaty funkcjonalności. Czy jest jakaś różnica poza redundancją, którą widzę w kwargs i dict w Pythonie?Jaka jest różnica między ** kwargs i dict w Pythonie 3.2?

+4

'** kwargs' niejawnie tworzy * A *' dict' obiekt (nazwane przez 'kwargs') załadowane kluczami i wartościami. To nie jest powielona funkcjonalność. –

+0

Rozwiń "wiele aspektów". Jakie inne obszary to duplikat funkcjonalności? – jdi

Odpowiedz

8

Jest różnica w argumencie rozpakowaniu (gdzie wiele osób korzysta kwargs) i przechodzącej dict jako jeden z argumentów:

  • Korzystanie rozpakowywanie Argument:

    # Prepare function 
    def test(**kwargs): 
        return kwargs 
    
    # Invoke function 
    >>> test(a=10, b=20) 
    {'a':10,'b':20} 
    
  • przechodzącą dict jako argument:

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

Różnice są głównie:

  • czytelność (można po prostu przekazywać argumenty słów kluczowych, nawet jeśli nie zostały wyraźnie zdefiniowane),
  • elastyczność (można obsługiwać kilka argumentów słów kluczowych jawnie, a reszta za pomocą **kwargs) ,
  • argumentem rozpakowanie pomaga uniknąć nieoczekiwanych zmian w obiekcie „zawierający” argumentów (co jest mniej ważne, ponieważ Python w ogóle zakłada deweloperzy wiedzą, co robią, który jest inny temat),
+4

Po rozpakowaniu klucze muszą być poprawnymi identyfikatorami –

+0

@gnibbler: Masz rację, +1. Całkowicie tego nie zauważyłem. Jako przykład podam 'test ({0: 10, '0': 20})' (który zwróci '{0: 10, '0': 20}'), który jest trudny do zastąpienia rozpakowaniem argumentów. – Tadeck

3

Jest to słuszne, że w większości przypadków można po prostu wymieniać dykty i ** kwargs.

Na przykład:

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} 

Jednak z kwargs masz większą elastyczność, jeśli połączyć je z innymi argumentami:

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

#evaluate 
>>> printer3(**my_dict) 
(5, 6, {}) 
Powiązane problemy