Tool zum Konvertieren von Python-Code in PEP8-kompatibel

113

Ich weiß, dass es Tools gibt, die überprüfen, ob Ihr Python-Code mit PEP8 kompatibel ist. Beispielsweise gibt es sowohl einen Onlinedienst als auch ein Python-Modul .

Ich kann jedoch keinen Dienst oder kein Modul finden , der meine Python-Datei in eine in sich geschlossene, PEP8-gültige Python-Datei konvertieren kann. Weiß jemand, ob es welche gibt?
Ich nehme an, es ist machbar, da es bei PEP8 nur um das Erscheinungsbild des Codes geht, oder?

Chen Xie
quelle
1
Ich glaube nicht, dass es ein Tool gibt, das den Code in PEP8-kompatiblen Code konvertiert. PEP8 enthielt auch Regeln für die Benennung von Variablen. Wenn ein solches Tool vorhanden ist, werden auch Ihre Variablennamen umbenannt, und Sie können Ihren eigenen Code möglicherweise nicht verstehen.
Ashwini Chaudhary
1
@AshwiniChaudhary Das ist ein guter Punkt. Erwähnenswert ist auch, dass sich das Ändern von Variablennamen auf andere auswirken kann, die Ihren Code bereits verwenden. Daher ist dies nicht immer eine gute Idee. (Autopep8 macht das nicht.)
Andy Hayden

Antworten:

38

Leider hat "pep8 Storming" (das gesamte Projekt) mehrere negative Nebenwirkungen:

  • viele Zusammenführungskonflikte
  • git Schuld brechen
  • Codeüberprüfung erschweren

Als Alternative (und danke an @yp für die Idee ) habe ich ein kleines Paket geschrieben, das nur die Zeilen automatisch bearbeitet, an denen Sie seit dem letzten Commit / Branch gearbeitet haben:

Grundsätzlich verlassen Sie das Projekt ein wenig besser als Sie es vorgefunden haben :

pip install pep8radius

Angenommen, Sie haben Ihre Arbeit erledigt masterund sind bereit, sich zu verpflichten:

# 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

Oder um die neuen Zeilen zu bereinigen, die Sie seit dem letzten Festschreiben festgeschrieben haben:

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

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

Grundsätzlich pep8radiuswird autopep8 auf Zeilen in der Ausgabe von git / hg diff angewendet (vom letzten gemeinsamen Commit ).

Dieses Skript funktioniert derzeit mit git und hg. Wenn Sie etwas anderes verwenden und möchten, dass dies funktioniert, schreiben Sie bitte einen Kommentar / ein Problem / eine PR !

Andy Hayden
quelle
2
+1 sehr gute Initiative ... Ich denke darüber nach, wie man ein Notepad ++ - Plugin für den gleichen Zweck erstellt ... da dies mein Lieblingseditor unter Windows ist
kmonsoor
1
@kmonsoor gute Idee, ich hatte nicht an Editor-Plugins gedacht! Lassen Sie mich auf github wissen, wie ich helfen / die Verwendung außerhalb von CLI vereinfachen kann ... Ich sehe einige (lösbare) Probleme.
Andy Hayden
hier fand ich eine interessante Liste von Editor-Plugins github.com/jcrocholl/pep8/wiki/RelatedTools , obwohl kein Glück für Notepad ++ ...
kmonsoor
1
Ich habe gerade ein Skript erstellt, um eine Brücke zwischen Notepad ++ und Autopep8 zu schlagen, basierend auf einem anderen Plugin "Python Script". Es funktioniert jedoch. Bitte überprüfen Sie hier: bit.ly/pep8_tonizer
kmonsoor
184

Sie können autopep8 verwenden ! Während Sie sich eine Tasse Kaffee machen, entfernt dieses Tool glücklich alle lästigen PEP8-Verstöße, die die Bedeutung des Codes nicht ändern .

Installieren Sie es über pip:

pip install autopep8

Wenden Sie dies auf eine bestimmte Datei an:

autopep8 py_file --in-place

oder zu Ihrem Projekt (rekursiv) gibt Ihnen die ausführliche Option ein Feedback darüber, wie es läuft :

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

Hinweis: Manchmal reicht die Standardeinstellung von 100 Durchgängen nicht aus. Ich habe sie auf 2000 gesetzt, da sie relativ hoch ist und alle bis auf die problematischsten Dateien abfängt (sie werden nicht mehr übergeben, sobald keine auflösbaren pep8-Verstöße festgestellt werden).

An dieser Stelle schlage ich vor, erneut zu testen und ein Commit durchzuführen!

Wenn Sie eine "vollständige" PEP8-Konformität wünschen: Eine Taktik, die ich verwendet habe, besteht darin, Autopep8 wie oben auszuführen und dann PEP8 auszuführen, das die verbleibenden Verstöße (Datei, Zeilennummer und was) druckt:

pep8 project_dir --ignore=E501

und ändern Sie diese manuell einzeln (zB E712s - Vergleich mit Booleschen Werten).

Hinweis: autopep8 bietet ein --aggressiveArgument (um diese bedeutungsverändernden Verstöße rücksichtslos zu "beheben"), aber Vorsicht, wenn Sie aggressiv sind, müssen Sie möglicherweise debuggen ... (z. B. in numpy / pandas, True == np.bool_(True)aber nicht True is np.bool_(True)!)

Sie können überprüfen, wie viele Verstöße jedes Typs (vorher und nachher):

pep8 --quiet --statistics .

Hinweis: Ich halte E501s (Zeile zu lang) für einen Sonderfall, da wahrscheinlich viele davon in Ihrem Code enthalten sind und diese manchmal nicht durch Autopep8 korrigiert werden.

Als Beispiel habe ich diese Technik auf die Pandas- Codebasis angewendet .

Andy Hayden
quelle
@hayden Haben Sie Kommentare dazu, wie zuverlässig dies ist und wie hoch das Verhältnis von automatischen Korrekturen zu seltsamen Problemen ist?
Marius
@Marius Ich habe dies für Pandas-Code verwendet (der ziemlich groß ist) und es wurden keine seltsamen Probleme angezeigt. Es wird kein Code geändert, der die Bedeutung ändert . Ich habe meine Antwort aktualisiert, um diese zu erwähnen. Es gab zuvor ein Problem mit Sphinx 'Hashbang (ein Fehler in PEP8 wurde jetzt behoben).
Andy Hayden
2
Erzwingt dies Strunk and White in Kommentaren?
Eric
1
Ab dem 25. Oktober 2017 wurde das pep8in dieser Antwort erwähnte Paket in pycodestyle: github.com/PyCQA/pycodestyle/releases/tag/1.7.1 umbenannt
hb20007
8

@Andy Hayden gab einen guten Überblick über autopep8. Darüber hinaus gibt es ein weiteres Paket namens pep8ify , das dasselbe tut.

Beide Pakete können jedoch nur Flusenfehler entfernen, aber keinen Code formatieren.

little = more[3:   5]

Der obige Code bleibt auch nach pep8ifying gleich. Aber der Code sieht noch nicht gut aus. Sie können Formatierer wie yapf verwenden , die den Code auch dann formatieren , wenn der Code PEP8-kompatibel ist. Der obige Code wird mit formatiert

little = more[3:5]

Manchmal zerstört dies sogar Ihre manuelle Formatierung. Beispielsweise

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

wird konvertiert zu

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

Sie können jedoch festlegen, dass einige Teile ignoriert werden sollen.

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

Entnommen aus meinem alten Blog-Beitrag: Automatisch PEP8 & Formatieren Sie Ihren Python-Code!

ChillarAnand
quelle
2
Ist das little = more[3: 5]ein Fehler in pep8 (der Bibliothek)? yapf ist hier definitiv die Zukunft. Der dahinter stehende Algorithmus (im Wesentlichen ein kürzester Pfad im Diagramm aller Formatierungsoptionen) ist eine sehr elegante Lösung und wird wahrscheinlich weniger Fehler sowie eine kanonische Formatierung aufweisen.
Andy Hayden
@AndyHayden Sieht aus wie es eine fehlende Funktion ist, es repariert nicht E225
ChillarAnand
5

Wenn Sie eclipse + PyDev verwenden, können Sie autopep8 einfach über die PyDev-Einstellungen aktivieren: Windows -> Einstellungen -> geben Sie 'autopep8' in den Suchfilter ein.

Überprüfen Sie die Option "Verwenden Sie autopep8.py für die Code-Formatierung?". -> OK

Jetzt sollte die CTRL-SHIFT-F-Code-Formatierung von eclipse Ihren Code mit autopep8 formatieren :)

Bildschirmfoto

mork
quelle
3

Ich habe mich intensiv mit verschiedenen Instrumenten für Python und Code befasst. Es gibt zwei Arten von Instrumenten: Linters - Analysieren Ihres Codes und Warnen vor schlecht verwendeten Codestilen und Anzeigen von Ratschlägen zur Behebung des Problems sowie Code-Formatierer - Wenn Sie Ihre Datei speichern, wird Ihr Dokument im PEP-Stil neu formatiert.

Da die Neuformatierung genauer sein muss - wenn sie etwas remorfiert, von dem Sie nicht möchten, dass sie unbrauchbar wird -, decken sie weniger Teile von PEP ab, zeigen Linters viel mehr.

Alle haben unterschiedliche Berechtigungen für die Konfiguration - zum Beispiel Pylinter, der in all seinen Regeln konfigurierbar ist (Sie können jede Art von Warnungen ein- und ausschalten), schwarz überhaupt nicht konfigurierbar.

Hier sind einige nützliche Links und Tutorials:

Dokumentation:

Linters (in der Reihenfolge ihrer Beliebtheit):

Code-Formatierer (in der Reihenfolge ihrer Beliebtheit):

Mikhail_Sam
quelle
1

Es gibt viele.

In IDEs sind normalerweise einige Formatierungsfunktionen integriert. IntelliJ Idea / PyCharm funktioniert, dies gilt auch für das Python-Plugin für Eclipse und so weiter.

Es gibt Formatierer / Linters, die auf mehrere Sprachen abzielen können. https://coala.io ist ein gutes Beispiel dafür.

Dann gibt es die Einzweckwerkzeuge, von denen viele in anderen Antworten erwähnt werden.

Eine spezielle Methode zur automatischen Neuformatierung besteht darin, die Datei in einen AST-Baum zu analysieren (ohne Kommentare zu löschen) und sie dann wieder in Text zu kopieren (was bedeutet, dass nichts von der ursprünglichen Formatierung erhalten bleibt). Ein Beispiel hierfür wäre https://github.com/python/black .

user7610
quelle