it-swarm.com.de

Tool zum Konvertieren von Python-Code in PEP8-Kompatibilität

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 ein Modul finden, das meine Python-Datei in eine eigenständige, PEP8-gültige Python-Datei convert umwandeln kann. Weiß jemand, ob es welche gibt?
Ich gehe davon aus, dass es machbar ist, da es sich bei PEP8 um das Aussehen des Codes handelt, richtig?

87
Chen Xie

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

  • viele Mischkonflikte
  • brechen git schuld
  • code-Überprüfung schwierig machen

Als Alternative (und dank @ y-p für die Idee ) habe ich ein kleines Paket geschrieben, das automatisch nur die Zeilen enthält, an denen Sie seit dem letzten Commit/Branch gearbeitet haben:

Grundsätzlich das Projekt etwas verlassen _ ​​ besser als du es gefunden hast :

pip install pep8radius

Angenommen, Sie haben Ihre Arbeit mit master erledigt und sind bereit zu begehen:

# 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 Commit festgelegt haben:

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

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

Grundsätzlich pep8radius wendet autopep8 auf Zeilen in der Ausgabe von git/hg diff (von dem letzten Shared Commit an.

Dieses Skript funktioniert derzeit mit git und hg, wenn Sie etwas anderes verwenden und möchten, dass dies funktioniert bitte posten Sie einen Kommentar/issue/PR !

31
Andy Hayden

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

Installiere es via pip:

pip install autopep8

Wenden Sie dies auf eine bestimmte Datei an:

autopep8 py_file --in-place

oder zu Ihrem Projekt (rekursiv), die ausführliche Option gibt Ihnen 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 Durchläufen nicht aus. Ich setze sie auf 2000, da sie ziemlich hoch ist und alle bis auf die problematischsten Dateien abfängt (wenn kein auflösbares pep8 gefunden wird, hört sie auf zu passieren Verstöße) ...

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

Wenn Sie die "vollständige" PEP8-Konformität wünschen: Eine von mir angewandte Taktik besteht darin, autopep8 wie oben auszuführen. Führen Sie dann PEP8 aus, das die verbleibenden Verstöße ausgibt. ( Datei, Zeilennummer und was):

pep8 project_dir --ignore=E501

und manuell ändern Sie diese einzeln (z. B. E712s - Vergleich mit Boolean).

Hinweis: autopep8 bietet ein --aggressive-Argument (um diese Verstöße gegen die Bedeutungsänderung rücksichtslos "zu beheben"). Wenn Sie jedoch aggressive Methoden verwenden, müssen Sie möglicherweise Fehler beheben ... (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 von jedem Typ (vor und nach):

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 von autopep8 korrigiert werden.

Als Beispiel habe ich angewendet Technik auf die Pandas Codebasis.

171
Andy Hayden

@Andy Hayden gab einen guten Überblick über autopep8. Zusätzlich dazu gibt es noch ein weiteres Paket namens pep8ify , das dasselbe tut.

Beide Pakete können jedoch nur Flusenfehler entfernen, jedoch 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 formatieren, wenn der Code PEP8-kompatibel ist. Der obige Code wird in formatiert 

little = more[3:5]

Manchmal zerstört dies sogar Ihre manuelle Formatierung. Zum Beispiel 

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

wird in konvertiert 

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

Aber Sie können es sagen, um einige Teile zu ignorieren.

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

Aus meinem alten Blogpost entnommen: Automatisch PEP8 & Formatieren Sie Ihren Python-Code!

7
ChillarAnand

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

Überprüfen Sie das Kontrollkästchen "autopep8.py für die Code-Formatierung verwenden". -> OK

Jetzt sollte der CTRL-SHIFT-F-Code von Eclipse mit autopep8 formatiert werden :)

screen shot

3
mork

Da gibt es viele.

IDEs verfügen normalerweise über eine eingebaute Formatierungsfunktion. IntelliJ Idea/PyCharm, das gleiche gilt für das Python-Plugin für Eclipse usw.

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

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

0
user7610