Come correggere il rientro di Python


264

Ho del codice Python con rientro incoerente. C'è un sacco di combinazioni di schede e spazi per peggiorare ulteriormente la questione, e persino l'indentazione dello spazio non viene preservata.

Il codice funziona come previsto, ma è difficile da mantenere.

Come posso correggere il rientro (come HTML Tidy , ma per Python) senza rompere il codice?


si può rivedere questo link e fornire i vostri input su come utilizzare reindent.py module-- stackoverflow.com/questions/12132481/installing-reindent-python/...
user1050619

Come menzionato di seguito da @ andy-hayden, guarda questa domanda correlata - sostanzialmente autopep8fornisce rientri e molto altro ancora: stackoverflow.com/questions/14328406/…
Pierz

2
Questa è una domanda follemente utile, mi trovo a dover fare abbastanza spesso. Non si tratta di "raccomandare uno strumento" piuttosto che "come farlo".
Andy Hayden,

Risposte:


282

Usa lo reindent.pyscript che trovi nella Tools/scripts/directory dell'installazione di Python:

Modifica i file Python (.py) in modo da utilizzare rientri di 4 spazi e nessun carattere di tabulazione. Taglia anche gli spazi e le schede in eccesso dalle estremità delle linee e rimuovi le righe vuote alla fine dei file. Assicurati anche che l'ultima riga termini con una nuova riga.

Dai un'occhiata a quello script per istruzioni dettagliate sull'uso.


51
Sfortunatamente, non fa parte della normale installazione di Python su Debian e Ubuntu; è suddiviso nel python-examplespacchetto.
effimero

16
Eccellente! Quindi tutto ciò che gli utenti Debian e Ubuntu devono fare è apt-get quel pacchetto. In alternativa, lo script è anche su svn.python.org/view/python/trunk/Tools/scripts/… .
Alex Martelli,

9
@Shay Erlichmen: prova "python -tt yourscript.py"
nosklo,

8
Gli utenti Fedora / RedHat / CentOS dovrebbero installare il pacchetto "python-tools".
Cristian Ciupitu,

26
Solo per aggiungere al commento di effimero: una volta python-examplesinstallato, troverai di nuovo il reindent /usr/share/doc/pythonX.X/examples/Tools/scripts/reindent.py.
Larry Hastings,

59

Se stai usando Vim , vedi :h retab.

                                                        *: ret * *: retab *
: [range] ret [ab] [!] [new_tabstop]
                        Sostituisci tutte le sequenze di spazi bianchi contenenti a
                        <Tab> con nuove stringhe di spazi bianchi usando il nuovo
                        valore tabstop fornito. Se non si specifica un nuovo
                        dimensione tabstop o è zero, Vim utilizza il valore corrente
                        di "tabstop".
                        Il valore corrente di "tabstop" è sempre utilizzato
                        calcola la larghezza delle schede esistenti.
                        Con!, Vim sostituisce anche le stringhe di solo normale
                        spazi con schede ove appropriato.
                        Con 'expandtab' attivo, Vim sostituisce tutte le schede con il
                        numero appropriato di spazi.
                        Questo comando imposta "tabstop" sul nuovo valore dato,
                        e se eseguito sull'intero file, che è predefinito,
                        non dovrebbe apportare alcuna modifica visibile.
                        Attenzione: questo comando modifica tutti i caratteri <Tab>
                        all'interno delle stringhe in un programma C. Usa "\ t" per evitare
                        questa (è comunque una buona abitudine).
                        ": Retab!" può anche cambiare una sequenza di spazi di
                        <Tab> caratteri, che possono rovinare un printf ().
                        {non in Vi}
                        Non disponibile quando | + ex_extra | la funzione era disabilitata a
                        tempo di compilazione.

Ad esempio, se si digita semplicemente

: ret

tutte le tue schede verranno espanse in spazi.

Potresti volerlo

: se et "abbreviazione di: set expandtab

per assicurarsi che eventuali nuove righe non utilizzino le schede letterali.


Se non stai usando Vim,

perl -i.bak -pe "s / \ t / '' x (8-pos ()% 8) / ad es." file.py

sostituirà le schede con spazi, supponendo che la scheda si fermi ogni 8 caratteri, in file.py(con l'originale che va file.py.bak, per ogni evenienza). Sostituisci gli 8 con 4 se invece i punti di tabulazione sono ogni 4 spazi.


2
Ha funzionato bene Questo è il modo più semplice per correggere la confusione del rientro delle schede.
Srikant,

Di sicuro non è il modo più semplice.
CONvocato

52

Vorrei che autopep8 facesse questo:

$ # see what changes it would make
$ autopep8 path/to/file.py --select=E101,E121 --diff

$ # make these changes
$ autopep8 path/to/file.py --select=E101,E121 --in-place

Nota: E101 ed E121 sono rientri pep8 (penso che si possa semplicemente passare --select=E1per risolvere tutti i problemi relativi al rientro, quelli che iniziano con E1).

Puoi applicarlo a tutto il tuo progetto usando il flag ricorsivo:

$ autopep8 package_dir --recursive --select=E101,E121 --in-place

Vedi anche Strumento per convertire il codice Python in conformità PEP8 .


è fantastico ... Ho cercato uno strumento come il rubocop di Ruby per il pitone
OkezieE,

1
autopep8fallisce se la sintassi non è corretta. puoi confermare che usandopython -tt <file.py>
Nishant il

47

autopep8 -i script.py

Usa autopep8

autopep8 formatta automagicamente il codice Python per conformarsi alla PEP 8 nullstyleguida. Utilizza l' pep8utilità per determinare quali parti delle nullcodeesigenze devono essere formattate. autopep8è in grado di risolvere la maggior parte dei nullformattingproblemi che possono essere segnalati da pep8.

pip install autopep8
autopep8 script.py    # print only
autopep8 -i script.py # write file

ho solo un codice di riga con "import os" e 4 spazi prima di esso, ma non rientra in quello ... qualsiasi motivo per cui
pkm

3
@pkm 4 spazi (o qualsiasi altra incisione che è un multiplo di 4) fa parte del PEP8
rbaleksandar

13

Usando Vim, non dovrebbe essere più coinvolto che colpire Esc, e quindi digitare ...

:%s/\t/    /g

... sul file che si desidera modificare. Ciò convertirà tutte le schede in quattro spazi. Se hai anche una spaziatura incoerente, allora sarà più difficile.


11
puoi rintracciare i programmatori originali e applicare tecniche di interrogazione avanzate? Non c'è niente di peggio del codice con rientro incoerente.
Ben Hughes,

3
@Ben L'inconsistenza incoerente è l'ultimo dei nostri problemi da quel ragazzo :)
Shay Erlichmen,

9

C'è anche PythonTidy (da quando hai detto che ti piace HTML Tidy).

Tuttavia, può fare molto di più che pulire semplicemente le schede. Se ti piace quel tipo di cose, vale la pena dare un'occhiata.


5

Sulla maggior parte dei sistemi simili a UNIX, puoi anche eseguire:

expand -t4 oldfilename.py > newfilename.py

dalla riga di comando, modificando il numero se si desidera sostituire le schede con un numero di spazi diverso da 4. È possibile scrivere facilmente uno script di shell per farlo con un gruppo di file contemporaneamente, mantenendo i nomi dei file originali.


1
Nota che usare lo stesso file non funziona e ti lascia con un file vuoto, ma questa risposta funziona davvero e la uso quando devo convertire le mie schede in spazi. Qualcuno potrebbe spiegare il downvote? Lo faccio +1.
S. Kerdel,

Esiste un modo possibile per recuperare il file sovrascritto? Ho appena usato il metodo sopra e il valore del mio giorno è svanito facepalm . Grazie
Simas il

4

Se sei pigro (come me), puoi anche scaricare una versione di prova di Wingware Python IDE, che ha uno strumento di correzione automatica per il rientro incasinato. Funziona abbastanza bene. http://www.wingware.com/


4

Lo script reindent non ha funzionato per me, a causa di un modulo mancante. Comunque, ho trovato questo sedcomando che fa il lavoro perfetto per me:

sed -r 's/^([  ]*)([^ ])/\1\1\2/' file.py

2
Opzioni illegali -r.
HelloWorld,

2

Prova Emacs. Ha un buon supporto per il rientro necessario in Python. Si prega di controllare questo link http://python.about.com/b/2007/09/24/emacs-tips-for-python-programmers.htm


2
python-mode è utile per scrivere Python, ma nulla al link descrive come correggere il rientro in un file esistente.
effimero

5
Mx untabify trasformerà le schede in spazio in emacs
Paul Hildebrandt,

Il collegamento è (effettivamente) interrotto. Reindirizza a una pagina con il titolo "C Programming Language for Beginners" (!).
Peter Mortensen,


0

Ho una soluzione semplice per questo problema. Puoi prima digitare ": retab" e poi ": retab!", Quindi tutto andrebbe bene


1
Digita " :retab" in quale contesto. A Vim ?
Peter Mortensen,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.