2010-10-21 14 views
26

sono stato alla ricerca sopra la documentazione Python per formattazione del codice delle migliori pratiche per le grandi liste e dizionari, per esempio,Python "best practice formattazione" per gli elenchi, dizionario, ecc

something = {'foo' : 'bar', 'foo2' : 'bar2', 'foo3' : 'bar3'..... 200 chars wide, etc..} 

o

something = {'foo' : 'bar', 
      'foo2' : 'bar2', 
      'foo3' : 'bar3', 
      ... 
      } 

o

something = { 
      'foo' : 'bar', 
      'foo2' : 'bar2', 
      'foo3' : 'bar3', 
      ... 
      } 

Come si gestiscono in profondità di nidificazione delle liste/dizionari?

risposta

32

Il mio modo preferito è:

something = {'foo': 'bar', 
      'foo2': 'bar2', 
      'foo3': 'bar3', 
      ... 
      'fooN': 'barN'} 
+7

+1 è conforme a PEP8. –

+3

Un po 'meno git-friendly in quel cambiamento di chiave/valore sulla prima o sull'ultima riga di pull in altri elementi di sintassi in changeset. –

1

Preferisco il secondo o il terzo.

Motivo:

  1. Ogni elemento è sulla propria riga
  2. Raggiungendo alla fine della riga per aggiungere un nuovo elemento è un dolore in un editor di testo
  3. L'aggiunta di un nuovo elemento è facile
  4. Con la terza opzione, a volte è possibile controllare il numero di elementi selezionando quelle linee. La maggior parte degli editori ti dirà il numero di linee selezionate.
+0

# 4 funziona anche con la seconda opzione. – aaronasterling

+0

@aaronasterling: Sì, avrei dovuto scrivere seconda e terza opzione. – pyfunc

+0

Non sono d'accordo con # 2. Usa un editor di testo che ti dà energia e non ti limita. –

1

Bene, il primo è un no-go, poiché le tue linee dovrebbero avere solo 79 caratteri. Per quanto riguarda le altre due opzioni, suppongo sia una questione di gusti, ma personalmente preferisco la seconda opzione.

5

Definire il dizionario in qualsiasi modo si desidera e quindi provare questo:

from pprint import pprint 

pprint(yourDict) 

# for a short dictionary it returns: 

{'foo': 'bar', 'foo2': 'bar2', 'foo3': 'bar3'} 

# for a longer/nested: 

{'a00': {'b00': 0, 
     'b01': 1, 
     'b02': 2, 
     'b03': 3, 
     'b04': 4, 
     'b05': 5, 
     'b06': 6, 
     'b07': 7, 
     'b08': 8, 
     'b09': 9}, 
'a01': 1, 
'a02': 2, 
'a03': 3, 
'a04': 4, 
'a05': 5, 
'a06': 6, 
'a07': 7, 
'a08': 8, 
'a09': 9, 
'a10': 10} 

Ti piace l'uscita?

+0

OP non vuole sapere come stamparlo ma come formattarlo nel codice sorgente. – aaronasterling

+0

@aaronasterling - ovviamente. Questo può mostrargli come si formatta una determinata struttura nel suo codice sorgente. – eumiro

+1

quindi come viene stampato il pprint? secondo o terzo? –

1

Sicuramente NON l'opzione 1, uno dei punti di forza di Python è la sua leggibilità. L'opzione 1 diminuisce notevolmente la leggibilità.

Fuori 2 e 3, io eco le stesse ragioni pyfunc dichiarato per entrambi.

Tuttavia, nel mio codice preferisco l'opzione 3 semplicemente perché il primo elemento a volte viene "perso" trovandosi alla fine della riga di dichiarazione, e dopo una veloce occhiata al codice a volte non lo vedrò immediatamente. So che è un po 'sciocco, ma la mente funziona in modi misteriosi ...

2

Se si passa per ganeti (che rispetta PEP 8) si dovrebbe scegliere la terza opzione.

something = { 
      'foo1': 'bar1', 
      'foo2': 'bar2', 
      'foo3': 'bar3', 
      ... 
      } 

Mi piace questo esp. perché è possibile selezionare solo gli elementi che si desidera. E sento che rimuovere o aggiungere elementi alle due estremità è più veloce in questo modo.

Nota: Come sottolineato nel commento non ci dovrebbero essere spazi bianchi prima ':' (E203) come da PEP. stile di rientro

+0

Questo non è conforme a PEP8 perché c'è spazio bianco prima di ':' (E203). –

+0

@ Török Gábor: copia incolla errore: P –

+0

collegamento "ganeti" non funziona :( –

24

di aaronasterling è quello che preferisco.Questo e molti altri stili sono spiegati in another SO Question. Soprattutto la risposta di Lennart Regebro ha dato una bella panoramica.

Ma questo stile è stato il più votato per:

my_dictionary = { 
    1: 'something', 
    2: 'some other thing', 
} 
+0

Questo non è il mio stile :) –

+4

Mi piace particolarmente che python ti permette di seguire l'ultimo elemento di un dizionario, elenco o tupla con un virgola. Ciò rende più facile riordinare o estendere la sequenza in un secondo momento. – AndrewF

+2

@AndrewF Devo essere d'accordo. Questa è una delle poche cose su cui JSON mi fa arrabbiare, rifiutando di gestire una virgola finale in sequenze. –

0

Amo il secondo modo:

something = {'foo' : 'bar', 
     'foo2' : 'bar2', 
     'foo3' : 'bar3', 
     ... 
     'fooN': 'barN'} 
0

precedente alla lettura di questo post avrei optato per la terza opzione si dà. Ma ora potrei andare per quello che non è lo stile di Török Gábor:

my_dictionary = { 1: 'qualcosa', 2: 'qualche altra cosa', }

Ma onestamente nulla a parte il tuo la prima opzione probabilmente va bene.

9

Secondo il PEP8 style guide ci sono due modi per formattare un dizionario:

mydict = { 
    'key': 'value', 
    'key': 'value', 
    ... 
    } 

O

mydict = { 
    'key': 'value', 
    'key': 'value', 
    ... 
} 

Se si vuole conformarsi alle PEP8 direi qualsiasi altra cosa è tecnicamente sbagliato.