2013-04-24 8 views
13

Was ist der pep8-kompatible Weg, einen tiefen Wörterbuchzugriff zu machen?pep8-kompatibler tiefer Wörterbuchzugriff

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

E501 Linie zu lang (118> 80 Zeichen)

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

E211 Leerzeichen vor '['

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

E124 schließende Klammer nicht visuelle Vertiefung paßt

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

Dies passiert pep8 scheint aber weniger als ideal

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

Gibt es eine Möglichkeit, die Linie zu brechen, so dass es schön aussieht und PEP8 konform?

+2

Wenn sich die Schlüssel bereits in einer Liste befinden und Sie wissen, dass der Wert existiert, könnten Sie: 'value = reduce (dict.get, keys, dct)'. – jfs

Antwort

6

Vielleicht nicht der beste Weg, aber es funktioniert:

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

Das funktioniert aber auch, die die vorgeschlagene Methode ist:

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

Ich denke, der erste Weg ist die beste Option. Abgesehen davon, ist die beste Option, Ihre Datenstrukturen besser zu gestalten, so dass Sie nicht erst darauf stoßen. Es gibt nicht so viele Fälle, in denen Sie einen Baum von Objekten mit einer Tiefe von 5 Ebenen haben, wo keine der Zwischenebenen allein nützlich ist - und wenn Sie einen solchen Fall haben, sind Sie wahrscheinlich besser dran, einen Baum zu verwenden Iterator- oder DOM-artige Suchen als diese Art des Zugriffs. – abarnert

+0

Der erste Weg hilft Ihnen nicht, wenn Sie einen Wert festlegen müssen. – tponthieux

+0

@tponthieux: Sicher ist es. 'a' ist nur ein Name für das interne Wörterbuch in' dct'. 'a [k] = v 'ist äquivalent zu' dct ['long_key_name_one'] ['long_key_name_zwei'] [k] = v' in diesem Fall. – jfs

3

Wenn Sie es in einer Funktion verwenden (und man kann verwenden print() als Funktion seit 2.7 afaik)

Sie nur implizite Verkettung innerhalb einer Klammer

nutzen könnte
print(dct['long_key_name_one'] 
     ['long_key_name_two'] 
     ['long_key_name_three'] 
     ['long_key_name_four'] 
     ['long_key_name_five']) 
Verwandte Themen