Strumento per convertire il codice Python in modo che sia conforme a PEP8


113

So che esistono strumenti che convalidano se il tuo codice Python è conforme a PEP8, ad esempio esiste sia un servizio online che un modulo python .

Tuttavia, non riesco a trovare un servizio o un modulo in grado di convertire il mio file Python in un file Python autonomo e valido PEP8. Qualcuno sa se ce ne sono?
Presumo sia fattibile poiché PEP8 riguarda l'aspetto del codice, giusto?


1
Non credo che ci sia alcuno strumento che converta il codice in codice compatibile con PEP8. PEP8 includeva anche regole di denominazione delle variabili, quindi, se tale strumento esiste, rinominerà anche i nomi delle variabili e potresti non essere in grado di comprendere il tuo codice.
Ashwini Chaudhary

1
@AshwiniChaudhary Questo è un buon punto, vale anche la pena ricordare che la modifica dei nomi delle variabili può influenzare gli altri che già utilizzano il tuo codice, in quanto tale non è sempre una buona idea. (autopep8 non lo fa.)
Andy Hayden

Risposte:


38

Sfortunatamente "pep8 storming" (l'intero progetto) ha diversi effetti collaterali negativi:

  • molti conflitti di fusione
  • rompi la colpa
  • rendere difficile la revisione del codice

In alternativa (e grazie a @yp per l'idea ), ho scritto un piccolo pacchetto che autopep8 contiene solo quelle righe su cui hai lavorato dall'ultimo commit / branch:

Fondamentalmente lasciando il progetto un po ' meglio di come l'hai trovato :

pip install pep8radius

Supponi di aver svolto il tuo lavoro mastere di essere pronto a impegnarti:

# be somewhere in your project directory
# see the diff with pep, see the changes you've made since master
pep8radius master --diff
# make those changes
pep8radius master --diff --in-place

O per pulire le nuove righe che hai commesso dall'ultimo commit:

pep8radius --diff
pep8radius --diff --in-place

# the lines which changed since a specific commit `git diff 98f51f`
pep8radius 98f51f --diff

Fondamentalmente pep8radiussta applicando autopep8 alle righe nell'output di git / hg diff ( dall'ultimo commit condiviso ).

Questo script attualmente funziona con git e hg, se stai usando qualcos'altro e vuoi che funzioni per favore pubblica un commento / problema / PR !


2
+1 iniziativa molto buona ... sto pensando a come creare un plugin per Notepad ++ per lo stesso scopo ... dato che è il mio editor preferito su Windows
kmonsoor

1
@kmonsoor buona idea, non avevo pensato ai plugin dell'editor! Fammi sapere su GitHub in qualsiasi modo io possa aiutare / rendere più facile l'uso al di fuori della CLI ... Prevedo alcuni problemi (risolvibili).
Andy Hayden

qui ho trovato un interessante elenco di plug-in dell'editor github.com/jcrocholl/pep8/wiki/RelatedTools , anche se senza fortuna per Notepad ++ ...
kmonsoor

1
Ho appena creato uno script per collegare Notepad ++ e Autopep8, basandomi su un altro plugin "Python Script". Tuttavia, funziona. Per favore controlla qui: bit.ly/pep8_tonizer
kmonsoor

185

Puoi usare autopep8 ! Mentre ti prepari una tazza di caffè, questo strumento rimuove felicemente tutte quelle fastidiose violazioni di PEP8 che non cambiano il significato del codice.

Installalo tramite pip:

pip install autopep8

Applicalo a un file specifico:

autopep8 py_file --in-place

o al tuo progetto (ricorsivamente), l'opzione dettagliata ti dà un feedback su come sta andando :

autopep8 project_dir --recursive --in-place --pep8-passes 2000 --verbose

Nota: a volte il valore predefinito di 100 passaggi non è sufficiente, l'ho impostato su 2000 perché è ragionevolmente alto e catturerà tutti i file tranne i più fastidiosi (smette di passare una volta che non trova infrazioni pep8 risolvibili) ...

A questo punto suggerisco di ripetere il test e di fare un commit!

Se si desidera una conformità PEP8 "completa" : una tattica che ho usato è eseguire autopep8 come sopra, quindi eseguire PEP8, che stampa le violazioni rimanenti (file, numero di riga e cosa):

pep8 project_dir --ignore=E501

e modificarli manualmente individualmente (ad esempio E712s - confronto con booleano).

Nota: autopep8 offre un --aggressiveargomento (per "correggere" spietatamente queste violazioni che cambiano significato), ma attenzione se usi aggressivo potresti dover eseguire il debug ... (ad esempio in numpy / panda True == np.bool_(True)ma non True is np.bool_(True)!)

Puoi controllare quante violazioni di ogni tipo (prima e dopo):

pep8 --quiet --statistics .

Nota: considero gli E501 (riga troppo lunga) un caso speciale in quanto probabilmente ce ne saranno molti nel tuo codice e talvolta questi non vengono corretti da autopep8.

Ad esempio, ho applicato questa tecnica alla base di codice dei panda .


@hayden Hai qualche commento su quanto sia affidabile e sul rapporto tra le correzioni di automagic e i problemi strani che introduce?
Marius

@Marius L'ho usato sul codice panda (che è piuttosto grande) e non ha mostrato problemi strani, non cambierà il codice che cambia il significato , ho aggiornato la mia risposta per menzionarli. In precedenza aveva un problema con l'hashbang di Sphinx (un bug in PEP8 ora risolto).
Andy Hayden

2
Questo fa rispettare Strunk e White all'interno dei commenti?
Eric

1
A partire dal 25 ottobre 2017, il pep8pacchetto menzionato in questa risposta è stato rinominato in pycodestyle: github.com/PyCQA/pycodestyle/releases/tag/1.7.1
hb20007

8

@ Andy Hayden ha fornito una buona panoramica di autopep8. Oltre a questo c'è un altro pacchetto chiamato pep8ify che fa anche la stessa cosa.

Tuttavia, entrambi i pacchetti possono rimuovere solo errori di lanugine ma non possono formattare il codice.

little = more[3:   5]

Il codice sopra rimane lo stesso anche dopo la pep8ificazione. Ma il codice non ha ancora un bell'aspetto. È possibile utilizzare formattatori come yapf , che formatterà il codice anche se il codice è conforme a PEP8. Il codice sopra verrà formattato in

little = more[3:5]

A volte questo distrugge persino la formattazione manuale. Per esempio

BAZ = {
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
}

sarà convertito in

BAZ = {[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]}

Ma puoi dirgli di ignorare alcune parti.

BAZ = {
   [1, 2, 3, 4],
   [5, 6, 7, 8],
   [9, 10, 11, 12]
}  # yapf: disable

Tratto dal mio vecchio post sul blog: Automatically PEP8 & Format Your Python Code!


2
È little = more[3: 5]un bug in pep8 (la libreria)? yapf è sicuramente il futuro qui, l'algoritmo dietro di esso (essenzialmente un percorso più breve nel grafico di tutte le opzioni di formattazione) è una soluzione molto elegante e probabilmente avrà meno bug e formattazione canonica.
Andy Hayden,

@AndyHayden Sembra che sia una funzione mancante, non risolve E225
ChillarAnand

5

Se stai usando eclipse + PyDev puoi semplicemente attivare autopep8 dalle impostazioni di PyDev: Windows -> Preferenze -> digita "autopep8" nel filtro di ricerca.

Controlla "usa autopep8.py per la formattazione del codice?" -> OK

Ora la formattazione del codice CTRL-MAIUSC-F di eclipse dovrebbe formattare il codice utilizzando autopep8 :)

immagine dello schermo


3

Ho fatto un'ampia ricerca su diversi strumenti per python e stile di codice. Ci sono due tipi di strumenti: linters - analizza il tuo codice e fornisce alcuni avvertimenti sugli stili di codice usati male e mostra consigli su come risolverlo, e formattatore di codice - quando salvi il tuo file riformatta il tuo documento usando lo stile PEP.

Poiché la riformattazione deve essere più accurata - se rimorfia qualcosa che non vuoi che diventi inutile - coprono meno parte di PEP, i linter mostrano molto di più.

Tutti hanno permessi diversi per la configurazione - ad esempio, pylinter configurabile in tutte le sue regole (puoi attivare / disattivare ogni tipo di avviso), nero non configurabile affatto.

Ecco alcuni link e tutorial utili:

Documentazione:

Linters (in ordine di popolarità):

Formattatori di codice (in ordine di popolarità):


1

Ci sono molti.

Gli IDE di solito hanno alcune funzionalità di formattazione integrate. IntelliJ Idea / PyCharm lo fa, lo stesso vale per il plugin Python per Eclipse e così via.

Esistono formattatori / linter che possono indirizzare più lingue. https://coala.io è un buon esempio di questi.

Poi ci sono gli strumenti a scopo unico, di cui molti sono menzionati in altre risposte.

Un metodo specifico di riformattazione automatica è analizzare il file nell'albero AST (senza rilasciare commenti) e quindi scaricarlo di nuovo nel testo (il che significa che non viene conservato nulla della formattazione originale). Un esempio potrebbe essere https://github.com/python/black .

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.