2010-04-28 19 views
29

Quale è il preferito ("." Indica lo spazio bianco)?Rientro Python in "righe vuote"

A)

def foo(): 
    x = 1 
    y = 2 
.... 
    if True: 
     bar() 

B)

def foo(): 
    x = 1 
    y = 2 

    if True: 
     bar() 

mia intuizione sarebbe B (che è anche quello che vim fa per me), ma vedo persone che utilizzano A) per tutto il tempo. È solo perché la maggior parte degli editori là fuori è rotta?

risposta

18

Il PEP 8 non sembra essere chiaro su questo problema, anche se le affermazioni su "righe vuote" potrebbero essere interpretate a favore di B. Il controllore di stile PEP 8 (pep8.py) preferisce B e avverte se si usa UN; tuttavia, entrambe le varianti sono legali. Il mio punto di vista è che, dal momento che Python interpreterà correttamente il codice in entrambi i casi, questo non ha molta importanza, e provare a farla rispettare sarebbe un sacco di lavoro per un guadagno molto scarso. Suppongo che se sei molto categorico a favore dell'uno o dell'altro puoi automaticamente convertire l'uno con l'altro. Provare a sistemare manualmente tutte queste linee, però, sarebbe un'impresa enorme e davvero non ne vale la pena, IMHO.

+8

Ci sono buoni argomenti a favore di A - copia nella shell, B porta a problemi con alcuni editor. A meno che non ci siano problemi con A sembrerebbe essere il caso di "Un aiuto in alcuni casi, fa male a nessuno" e quindi A dovrebbe essere usato. – Ted

+1

's/^ ([\ t] +) ([^ \ r \ n] *) (\ r? \ N) \ r? \ N/\ 1 \ 2 \ 3 \ 1 \ 3 /'. Ricerca: Cattura schede o spazi all'inizio di una riga, acquisisce tutti i caratteri non di nuova riga, se ce ne sono, acquisisci nuova riga, trova nuova linea *. Sostituisci: indentazione, contenuto di riga, nuova riga, rientranza, nuova riga. Avvertenza: se la linea di indentazione apre un nuovo blocco, la regex non lo rileva e pone semplicemente la riga successiva allo stesso livello di indentazione. * Ignoro il secondo formato di nuova riga e uso solo il precedente formato di nuova riga per promuovere la coerenza –

0

Emacs fa B) per me, ma davvero non credo che importi. A) significa che è possibile aggiungere una riga al rientro corretto senza alcuna tabulazione.

9

Quella riga vuota appartiene a foo(), quindi considererei lo A il più naturale. Ma immagino sia solo una questione di opinione.

+0

Sono d'accordo che è più naturale, e non sono d'accordo è una questione di opinione. È un fatto. –

3

Non chiamerei necessariamente il primo esempio "interrotto", perché so che alcune persone lo odiano quando il cursore "salta indietro" quando si sposta il cursore su o giù nel codice. Per esempio. Visual Studio (almeno 2008) impedisce automaticamente che ciò accada senza utilizzare alcun carattere di spaziatura su quelle righe.

28

Se si utilizza A, è possibile copiare incollare il blocco in guscio pitone, B otterrà errore rientro inaspettato.

+0

Ho provato a utilizzare A in idlex e ho ottenuto invece un errore di sintassi non valido. – obesechicken13

+0

La versione B non funziona bene quando copia/incolla in iPython. – Mitch

+0

@ obesechicken13 Questi punti dovrebbero essere spazi, sono disegnati in modo che tu sappia che sono lì. – pydsigner

1

La mia esperienza nello sviluppo open source è che non si dovrebbe mai lasciare spazi vuoti all'interno di righe vuote. Inoltre non si dovrebbe mai lasciare lo spazio bianco finale.

È una questione di etichetta di codice.

+0

+1: Ho il mio spazio vuoto di fine striscia IDE. –

+3

non in una lingua in cui il rientro è obbligatorio come python –

+1

@ Lo'oris La rientranza è obbligatoria per il codice ma non per le righe vuote. Pertanto, gli spazi in una riga vuota non sono necessari. –

4

TextMate interrompe il blocco del collasso se si utilizza B, e preferisco A comunque poiché è più "logico".

+0

Interessante. Ho appena provato con EditPadPro che utilizza anche il livello di indentazione per la piegatura del codice e gestisce bene le linee vuote. –

7

Aggiunta di una corretta indentazione di righe vuote (stile A in questione) migliora notevolmente la leggibilità del codice con display spazi abilitato perché rende più facile da vedere se il codice dopo una riga vuota è parte dello stesso blocco di rientro o meno.

Per un linguaggio come Python, in cui non esiste un'istruzione finale o parentesi chiusa, sono sorpreso che questo non faccia parte di PEP. Si consiglia vivamente di modificare Python con spazi bianchi di visualizzazione, per evitare sia spazi bianchi finali che indentazioni miste.

Confrontare leggendo la seguente:

A)

def foo(): 
....x = 1 
....y = 2 
.... 
....if True: 
........bar() 

B)

def foo(): 
....x = 1 
....y = 2 

....if True: 
........bar() 

In Un, è molto più chiaro che le ultime due righe sono parte di foo. Questo è ancora più utile a livelli di rientro più elevati.

0

vi scoraggia implicitamente il comportamento in A poiché le navigazioni {/} non funzionano più come previsto. git lo scoraggia esplicitamente evidenziandolo in rosso quando si esegue git diff. Vorrei anche sostenere che se una linea contiene spazi non è una riga vuota.

Per questo motivo preferisco fortemente B. Non c'è niente di peggio che aspettarsi di saltare sei o così allineate con il movimento { e finire in cima a una classe def.