2013-04-24 17 views
13

Qual è il modo conforme a pep8 per l'accesso deep dictionary?accesso deep dictionary conforme pep8

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

linea E501 troppo lunghi (118> 80 caratteri)

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

E211 spazio prima '['

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

parentesi di chiusura E124 non corrisponde indentazione visiva

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

Questo passa pep8 ma sembra tutt'altro che ideali

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

Esiste un modo per rompere la linea in modo che sembra bello ed è PEP8 compatibile?

+2

se le chiavi sono già in una lista e si sa che il valore esiste allora si potrebbe: 'value = reduce (dict.get, keys, dct)'. – jfs

risposta

6
non

Forse il modo migliore, ma funziona:

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

Ma questo funziona anche, che è il metodo suggerito:

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

Penso che il primo modo sia l'opzione migliore. Tranne che, in realtà, l'opzione migliore è progettare meglio le strutture dati in modo da non incorrere in questo in primo luogo. Non ci sono molti casi in cui hai un albero di oggetti a 5 livelli in profondità dove nessuno dei livelli intermedi è utile da solo e, se hai un caso del genere, probabilmente stai meglio usando un albero iteratore o ricerche in stile DOM di questo tipo di accesso. – abarnert

+0

Il primo modo non ti aiuta se devi impostare un valore. – tponthieux

+0

@tponthieux: certo che lo fa. 'a' è solo un nome per il dizionario interno in' dct'. 'a [k] = v' è equivalente a' dct ['long_key_name_one'] ['long_key_name_two'] [k] = v' in questo caso. – jfs

3

Se lo si utilizza all'interno di una funzione (e si poteva utilizzare print() in funzione dal 2,7 afaik)

Si potrebbe utilizzare la concatenazione implicita all'interno di una parentesi

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