2013-04-24 14 views
13

Jaki jest sposób zgodny z pep8, aby uzyskać dostęp do słownika?Zgodny z pep8 głęboki słownik dostępu

dct = { 
    'long_key_name_one': { 
     'long_key_name_two': { 
      'long_key_name_three': { 
       'long_key_name_four': { 
        'long_key_name_five': 1 
       } 
      } 
     } 
    } 
} 

Linia E501 zbyt długie (118> 80 znaków)

print dct['long_key_name_one']['long_key_name_two']['long_key_name_three']['long_key_name_four']['long_key_name_five'] 

E211 spacje przed '['

print dct['long_key_name_one']['long_key_name_two']\ 
    ['long_key_name_three']['long_key_name_four']['long_key_name_five'] 

nawias zamykający E124 nie pasuje do wcięcia wizualnej

print dct['long_key_name_one']['long_key_name_two' 
    ]['long_key_name_three']['long_key_name_four']['long_key_name_five'] 

To mija pep8 ale wydaje się mniej niż idealny

Czy istnieje sposób na rozbicie linii, aby wyglądała ładnie i była zgodna z systemem pep8?

+2

jeśli klucze są już na liście i wiesz, że istnieje, to możesz: 'value = reduce (dict.get, keys, dct)'. – jfs

Odpowiedz

6
nie

Być może najlepszym sposobem, ale to działa:

a = dct['long_key_name_one']['long_key_name_two'] 
b = a['long_key_name_three']['long_key_name_four']['long_key_name_five'] 

Ale to też działa, która jest proponowana metoda:

print (dct['long_key_name_one']['long_key_name_two'] 
     ['long_key_name_three']['long_key_name_four'] 
     ['long_key_name_five']) 
+1

Myślę, że pierwszy sposób jest najlepszą opcją. Tyle tylko, że najlepszą opcją jest lepsze zaprojektowanie struktur danych, więc nie napotkasz na tym. Nie ma tak wielu przypadków, w których drzewo obiektów ma 5 poziomów głębokości, gdzie żaden z pośrednich poziomów nie jest użyteczny sam - i jeśli masz taki przypadek, prawdopodobnie lepiej jest użyć drzewa iterator lub wyszukiwania w stylu DOM niż ten rodzaj dostępu. – abarnert

+0

Pierwszy sposób nie pomoże, jeśli musisz ustawić wartość. – tponthieux

+0

@tponthieux: na pewno tak. 'a' jest po prostu nazwą wewnętrznego słownika w' dct'. 'a [k] = v' jest równoważne' dct ['long_key_name_one'] ['long_key_name_two'] [k] = v' w tym przypadku. – jfs

3

Jeśli używamy go wewnątrz funkcji (i można używać print() w zależności od 2,7 AFAIK)

można po prostu użyć niejawny konkatenacji w nawiasach

print(dct['long_key_name_one'] 
     ['long_key_name_two'] 
     ['long_key_name_three'] 
     ['long_key_name_four'] 
     ['long_key_name_five'])