2010-05-17 6 views
138

Staram się nauczyć Pythona i zwracam szczególną uwagę na wspólne standardy kodowania. Może się to wydawać bezsensownym pytaniem, ale staram się skupić na najlepszych praktykach, tak jak się uczę, więc nie muszę oduczyć się żadnych "złych" nawyków.Jaka jest preferowana składnia do inicjowania polecenia dict: curly brace literals {} lub dict()?

widzę dwie wspólne metody inicjalizacji dict:

a = { 
    'a': 'value', 
    'another': 'value', 
} 

b = dict( 
    a='value', 
    another='value', 
) 

który jest uważany za "bardziej pythonic"? Którego używasz? Czemu?

+4

Jakiego samouczka używasz? Gdzie widziałeś przykłady, które prowadzą do zamieszania? –

+2

Cóż, używałem samouczka w języku Python, Dive into Python, a następnie różnych blogów, wpisów SO i innych zasobów Google. Oficjalni doktorzy używają '{}' całkiem równomiernie, ale widzę dużo jawnego podejścia 'dict()' w innym miejscu. Widziałem korzyści płynące z wyraźnej składni, ale brak podejścia w oficjalnych dokumentach sprawiał, że byłem podejrzliwy.Po opublikowaniu tego spojrzałam na dokumenty biblioteki dla 'dict' i znalazłam ostrzeżenie, że klucze muszą być poprawnymi identyfikatorami, kiedy jawne' dict' jest używane do inicjowania dict. – daotoad

+2

W jaki sposób "dict()" jest bardziej wyraźny niż "{}"? Nie rozumiem twojego zamieszania. Obie wydają mi się jednoznaczne. Czy możesz podać cytat lub odwołanie, które sprawiają, że mówisz "dict" to "explicite", a "{}" nie jest jednoznaczne? Jak myślisz, skąd wzięło się to rozróżnienie? –

Odpowiedz

162

Kręcone szelki. Przekazywanie argumentów ze słowami kluczowymi do dict(), mimo że działa pięknie w wielu scenariuszach, może zainicjować tylko mapę, jeśli klucze są poprawnymi identyfikatorami Python.

Innymi słowy nie można zrobić:

a = {'import': 'trade', 1: 7.8} 
65

Pierwsze, nawiasy klamrowe. W przeciwnym razie występują problemy z konsystencją z kluczami zawierającymi nieparzyste znaki, takie jak =.

# Works fine. 
a = { 
    'a': 'value', 
    'b=c': 'value', 
} 

# Eeep! Breaks if trying to be consistent. 
b = dict( 
    a='value', 
    b=c='value', 
) 
+3

Właśnie dlatego jeden może preferować metodę dict() do inicjalizacji, zmusza klucze słownika do poprawnych identyfikatorów, więc są one kompatybilne, na przykład z ** kwargs, a klucze są poprawnymi nazwami atrybutów. – RufusVS

46

Pierwsza wersja jest lepsze:

  • To działa dla wszystkich rodzajów kluczy, dzięki czemu można na przykład powiedzieć {1: 'one', 2: 'two'}. Drugi wariant działa tylko dla (niektórych) kluczy łańcuchowych. Używanie różnych rodzajów składni w zależności od typu kluczy byłoby niepotrzebną niekonsekwencją.
  • Jest szybszy:

    $ python -m timeit "dict(a='value', another='value')" 
    1000000 loops, best of 3: 0.79 usec per loop 
    $ python -m timeit "{'a': 'value','another': 'value'}" 
    1000000 loops, best of 3: 0.305 usec per loop 
    
  • Jeśli specjalna składnia dla literałów słownik nie był przeznaczony do użycia, to prawdopodobnie nie istnieje.
3

Myślę, że pierwsza opcja jest lepsza, ponieważ masz zamiar uzyskać dostęp do wartości jako [ „a”] [ „lub innej”]. Klucze w słowniku są ciągami i nie ma powodu, aby udawać, że nie są. Według mnie składnia słów kluczowych na pierwszy rzut oka wygląda sprytnie, ale przy drugim spojrzeniu jest niejasna. Ma to dla mnie sens tylko wtedy, gdy pracujesz z __dict__, a słowa kluczowe staną się później atrybutami, coś w tym rodzaju.

2

FYI, w przypadku, gdy musisz dodać atrybuty do słownika (rzeczy, które są dołączone do słownika, ale nie są jednym z kluczy), będziesz potrzebować drugiego formularza. W takim przypadku można zainicjować słownika z klawiszy posiadające dowolne znaki, po jednym na raz, tak jak poniżej:

class mydict(dict): pass 
    a = mydict()   
    a["b=c"] = 'value' 
    a.test = False 
0

Czasami dict() jest dobrym wyborem:

a=dict(zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)])) 

mydict=dict(zip(['mon','tue','wed','thu','fri','sat','sun'], 

[random.randint (0,100) dla x w zakresie (0,7)]))

+2

Istnieje funkcja wyliczania, która może to zrobić lepiej. Jeśli o to chodzi, istnieje typ Enum, który może lepiej wykonywać to, co robisz. Tak naprawdę nie jest to odpowiedź na to pytanie. – dusktreader