autopep8 formatiert Python-Code automatisch so, dass er dem PEP 8-Styleguide entspricht. Es verwendet das Dienstprogramm pycodestyle, um zu bestimmen, welche Teile des Codes formatiert werden müssen. autopep8 ist in der Lage, die meisten Formatierungsprobleme zu beheben, die von pycodestyle gemeldet werden können.
Inhalt
Installation
Anforderungen
Verwendung
Merkmale
Erweiterte Nutzung
Zeile für Zeile deaktivieren
Verwendung als Modul
Konfiguration
pyproject.toml
Verwendung mit Pre-Commit
Testen
Fehlerbehebung
pkg_resources.DistributionNotFound
Links
Von pip:
$ pip install --upgrade autopep8
Erwägen Sie die Verwendung der Option --user
.
autopep8 erfordert Pycodestyle.
So ändern Sie eine Datei direkt (mit aggressiver Stufe 2):
$ autopep8 --in-place --aggressive --aggressive <Dateiname>
Bevor Sie autopep8 ausführen.
import math, sys;def example1():####Dies ist ein langer Kommentar. Dies sollte so umbrochen werden, dass es in 72 Zeichen passt.some_tuple=( 1,2, 3,'a' );some_variable={'long':'Lange Codezeilen sollten in 79 Zeichen umgebrochen werden.','other':[math .pi, 100,200,300,9876543210,'Das ist eine lange Zeichenfolge, die weitergeht'],'more':{'inner':'Diese ganze logische Zeile sollte umschlossen werden.',some_tuple:[1,20,300,40000,500000000,60000000000000000]}}return (some_tuple, some_variable)def example2(): return {'has_key() is deprecated':True}.has_key({'f ':2}.has_key(''));class Beispiel3( Objekt ):def __init__ ( self, bar ): #Kommentare sollten nach dem Hash ein Leerzeichen haben. wenn bar : bar+=1; bar=bar* bar ; return bar else:some_string = """ Einrückungen in mehrzeiligen Zeichenfolgen sollten nicht berührt werden. Nur tatsächlicher Code sollte erneut eingerückt werden."""return (sys.path, some_string)
Nach dem Ausführen von autopep8.
import mathimport sysdef example1():# Dies ist ein langer Kommentar. Dies sollte so umbrochen werden, dass es in 72# Zeichen passt.some_tuple = (1, 2, 3, 'a')some_variable = {'long': 'Lange Codezeilen sollten in 79 Zeichen umgebrochen werden.','other': [math .pi,100,200,300,9876543210,'Dies ist eine lange Zeichenfolge, die weitergeht'],'more': {'inner': 'Diese ganze logische Zeile sollte werden verpackt.',some_tuple: [1,20,300,40000,500000000,60000000000000000]}}return (some_tuple, some_variable)def example2(): return ('' in {'f': 2}) in {'has_key() ist veraltet': True}class Beispiel3(Objekt):def __init__(self, bar):# Kommentare sollten nach dem Hash ein Leerzeichen haben.if bar:bar += 1bar = bar * barreturn barelse:some_string = """ Einrückungen in mehrzeiligen Zeichenfolgen sollten nicht berührt werden. Nur tatsächlicher Code sollte erneut eingerückt werden ."""return (sys.path, some_string)
Optionen:
Verwendung: autopep8 [-h] [--version] [-v] [-d] [-i] [--global-config Dateiname] [--ignore-local-config] [-r] [-j n] [-p n] [-a] [--experimental] [--exclude globs] [--list-fixes] [--ignore Fehler] [--select Fehler] [--max-line-length n] [--line-range line line] [--hang-closing] [--exit-code] [Dateien [Dateien ...]] Formatiert Python-Code automatisch so, dass er dem PEP 8-Styleguide entspricht. Positionsargumente: Dateien, die formatiert werden sollen, oder „-“ für Standard in optionale Argumente: -h, --help zeigt diese Hilfemeldung an und beendet den Vorgang --version zeigt die Versionsnummer des Programms an und beendet es -v, --verbose gibt ausführliche Nachrichten aus; mehrere -v führen zu mehr ausführliche Nachrichten -d, --diff gibt den Diff für die feste Quelle aus -i, --in-place Änderungen an vorhandenen Dateien vornehmen --global-config-Dateiname Pfad zu einer globalen pep8-Konfigurationsdatei; wenn diese Datei dies tut nicht vorhanden ist, wird dies ignoriert (Standard: ~/.config/pep8) --ignore-local-config Suchen Sie nicht nach lokalen Konfigurationsdateien und wenden Sie diese nicht an. wenn nicht übergeben, die Standardeinstellungen werden mit allen Konfigurationsdateien in aktualisiert das Stammverzeichnis des Projekts -r, --recursive rekursiv über Verzeichnisse ausführen; muss mit verwendet werden --in-place oder --diff -j n, --jobs n Anzahl paralleler Jobs; Passen Sie die CPU-Anzahl an, wenn der Wert vorhanden ist weniger als 1 -p n, --pep8-passes n maximale Anzahl zusätzlicher pep8-Durchgänge (Standard: unendlich) -a, --aggressive ermöglicht Änderungen, die keine Leerzeichen sind; multiple -ein Ergebnis in aggressivere Veränderungen --experimental ermöglicht experimentelle Korrekturen --exclude Globs schließen Datei-/Verzeichnisnamen aus, die mit diesen Komma- getrennte Kugeln --list-fixes listet Codes für Fixes auf; Wird von --ignore und --select verwendet --ignoreerrors behebt diese Fehler/Warnungen nicht (Standard: E226,E24,W50,W690) --selecterrors behebt nur diese Fehler/Warnungen (z. B. E4,W) --max-line-length n legt die maximal zulässige Zeilenlänge fest (Standard: 79) --line-range-Linie, --range-Linie, --range-Linie Beheben Sie nur Fehler, die innerhalb dieses umfassenden Bereichs von gefunden werden Zeilennummern (z. B. 1 99); Zeilennummern werden bei indiziert 1 --hang-closing Hang-Closing-Option, die an Pycodestyle übergeben wird --exit-code Änderung des Verhaltens des Exit-Codes. Standardverhalten von Rückgabewert, 0 bedeutet keine Unterschiede, 1 bedeutet Fehlerausgang. Geben Sie 2 zurück, wenn Sie diese Option hinzufügen. 2 ist vorhanden Unterschiede.
autopep8 behebt die folgenden von pycodestyle gemeldeten Probleme:
E101 – Alle Zeilen neu einrücken. E11 – Einrückung korrigieren. E121 – Einrückung auf ein Vielfaches von vier korrigieren. E122 – Fehlende Einrückung für hängende Einrückung hinzufügen. E123 – Schließbügel so ausrichten, dass er mit dem Öffnungsbügel übereinstimmt. E124 – Schließende Klammer so ausrichten, dass sie mit der optischen Einrückung übereinstimmt. E125 – Einzug, um die Zeile von der nächsten logischen Zeile zu unterscheiden. E126 – Übermäßig eingerückte hängende Einkerbung beheben. E127 – Visuelle Einrückung behoben. E128 – Visuelle Einrückung behoben. E129 – Visuelle Einrückung behoben. E131 – Hängender Einzug für nicht ausgerichtete Fortsetzungszeile korrigiert. E133 – Fehlende Einkerbung für die schließende Klammer beheben. E20 – Überflüssige Leerzeichen entfernen. E211 – Überflüssige Leerzeichen entfernen. E22 – Überflüssige Leerzeichen um Schlüsselwörter beheben. E224 – Überflüssige Leerzeichen um den Operator entfernen. E225 – Fehlendes Leerzeichen um den Operator behoben. E226 – Fehlendes Leerzeichen um den arithmetischen Operator behoben. E227 – Fehlendes Leerzeichen um den Bit-/Shift-Operator behoben. E228 – Fehlendes Leerzeichen um den Modulo-Operator behoben. E231 – Fehlendes Leerzeichen hinzufügen. E241 – Überflüssige Leerzeichen um Schlüsselwörter beheben. E242 – Überflüssige Leerzeichen um den Operator entfernen. E251 – Leerzeichen um das Zeichen „=“ des Parameters entfernen. E252 – Fehlender Leerraum um den Parameter „equals“. E26 – Abstand nach Kommentar-Hash für Inline-Kommentare korrigiert. E265 – Abstand nach Kommentar-Hash für Blockkommentare korrigiert. E266 – Zu viele führende „#“ für Blockkommentare behoben. E27 – Überflüssige Leerzeichen um Schlüsselwörter beheben. E301 – Fehlende Leerzeile hinzufügen. E302 – Fehlende 2 Leerzeilen hinzufügen. E303 – Überschüssige Leerzeilen entfernen. E304 – Leerzeile nach dem Funktionsdekorator entfernen. E305 – Nach dem Ende der Funktion oder Klasse werden zwei Leerzeilen erwartet. E306 – 1 Leerzeile vor einer verschachtelten Definition erwartet. E401 – Importe in separate Zeilen einfügen. E402 – Der Import auf Modulebene wurde behoben, der nicht oben in der Datei stand E501 – Versuchen Sie, Zeilen in die Zeichen von --max-line-length einzupassen. E502 – Überflüssiges Escapezeichen von Newline entfernen. E701 – Fügen Sie die durch Doppelpunkte getrennte zusammengesetzte Anweisung in separate Zeilen ein. E70 – Durch Semikolon getrennte zusammengesetzte Anweisung in separate Zeilen einfügen. E711 – Vergleich mit „Keine“ behoben. E712 – Vergleich mit boolean korrigiert. E713 – Verwenden Sie „nicht angemeldet“ für den Test der Mitgliedschaft. E714 – „Ist nicht“-Test für Objektidentität verwenden. E721 – Verwenden Sie „isinstance()“, anstatt Typen direkt zu vergleichen. E722 – Fix, außer. E731 – Verwenden Sie eine Def, wenn Sie keinen Lambda-Ausdruck zuweisen. W291 – Nachgestelltes Leerzeichen entfernen. W292 – Fügen Sie am Ende der Datei eine einzelne neue Zeile hinzu. W293 – Nachgestelltes Leerzeichen in leerer Zeile entfernen. W391 – Nachgestellte Leerzeilen entfernen. W503 – Zeilenumbruch vor binärem Operator behoben. W504 – Zeilenumbruch nach binärem Operator behoben. W605 – Ungültige Escape-Sequenz „x“ beheben.
autopep8 behebt auch einige Probleme, die von pycodestyle nicht gefunden wurden.
Normalisieren Sie Dateien mit gemischten Zeilenenden.
Fügen Sie eine Leerzeile zwischen einer Klassendokumentzeichenfolge und ihrer ersten Methodendeklaration ein. (Aktiviert mit E301
.)
Entfernen Sie Leerzeilen zwischen einer Funktionsdeklaration und ihrer Dokumentzeichenfolge. (Aktiviert mit E303
.)
autopep8 vermeidet die Behebung einiger von pycodestyle gefundener Probleme.
E112
/ E113
für Nicht-Kommentare sind Berichte über fehlerhafte Einrückungen, die gegen Syntaxregeln verstoßen. Diese sollten überhaupt nicht verändert werden.
E265
, das sich auf den Abstand nach dem Kommentar-Hash bezieht, wird ignoriert, wenn der Kommentar wie Code aussieht. autopep8 vermeidet es, diese zu ändern, da es sich nicht um echte Kommentare handelt. Wenn Sie die Pycodestyle-Warnung wirklich entfernen möchten, sollten Sie in Betracht ziehen, einfach den auskommentierten Code zu entfernen. (Dies kann durch Eradizieren automatisiert werden.)
Standardmäßig nimmt autopep8 nur Änderungen an Leerzeichen vor. Daher werden E711
und E712
standardmäßig nicht behoben. (Das Ändern von x == None
in x is None
kann die Bedeutung des Programms ändern, wenn x
seine __eq__
Methode überschrieben hat.) Es korrigiert auch nicht den veralteten Code W6
. Um diese aggressiveren Korrekturen zu aktivieren, verwenden Sie die Option --aggressive
:
$ autopep8 --aggressive <Dateiname>
Verwenden Sie mehrere --aggressive
, um den Aggressivitätsgrad zu erhöhen. Beispielsweise erfordert E712
die Aggressivitätsstufe 2 (da x == True
entweder in x
oder x is True
geändert werden könnte, autopep8 jedoch ersteres wählt).
--aggressive
verkürzt die Zeilen außerdem aggressiver. Außerdem werden nachfolgende Leerzeichen aggressiver entfernt. (Normalerweise berühren wir nachfolgende Leerzeichen in Docstrings und anderen mehrzeiligen Strings nicht. Und um noch aggressivere Änderungen an Docstrings vorzunehmen, verwenden Sie docformatter.)
Um nur eine Teilmenge der Fixes zu aktivieren, verwenden Sie die Option --select
. Um beispielsweise verschiedene Arten von Einrückungsproblemen zu beheben:
$ autopep8 --select=E1,W1 <Dateiname>
Wenn die zu reparierende Datei groß ist, möchten Sie möglicherweise ausführliche Fortschrittsmeldungen aktivieren:
$ autopep8 -v <Dateiname>
Die Übergabe von --experimental
ermöglicht die folgende Funktionalität:
Verkürzt Codezeilen unter Berücksichtigung ihrer Länge
$ autopep8 --experimental <Dateiname>
Es ist möglich, autopep8 zu deaktivieren, bis es in der Datei wieder aktiviert wird, indem Sie autopep8: off
verwenden und es dann mit autopep8: on
wieder aktivieren.
# autopep8: aus[ [23, 23, 13, 43], [32, 34, 34, 34], [56, 34, 34, 11], [10, 10, 10, 10], ]# autopep8: an
fmt: off
und fmt: on
sind ebenfalls gültig.
Der einfachste Weg, autopep8 als Modul zu verwenden, ist über die Funktion fix_code()
:
>>> autopep8 importieren >>> autopep8.fix_code('x= 123n') 'x = 123n'
Oder mit Optionen:
>>> autopep8 importieren >>> autopep8.fix_code('print( 123 )n', ... Optionen={'ignore': ['E']}) 'print( 123 )n'
Wenn $HOME/.config/pycodestyle
( ~.pycodestyle
in der Windows-Umgebung) vorhanden ist, wird es standardmäßig als globale Konfigurationsdatei verwendet. Alternativ können Sie die globale Konfigurationsdatei mit der Option --global-config
angeben.
Wenn außerdem die Dateien setup.cfg
, tox.ini
, .pep8
und .flake8
in dem Verzeichnis vorhanden sind, in dem sich die Zieldatei befindet, wird diese als Konfigurationsdatei verwendet.
pep8
, pycodestyle
und flake8
können als Abschnitt verwendet werden.
Beispiel für eine Konfigurationsdatei:
[pycodestyle] max_line_length = 120 ignorieren = E501
autopep8 kann auch pyproject.toml
verwenden. Der Abschnitt muss [tool.autopep8]
sein und pyproject.toml
hat Vorrang vor allen anderen Konfigurationsdateien.
Beispiel für eine Konfigurationsdatei:
[tool.autopep8] max_line_length = 120 ignore = "E501,W6" # oder ["E501", "W6"] an Ort und Stelle = wahr rekursiv = wahr aggressiv = 3
autopep8 kann als Hook für Pre-Commit verwendet werden.
Um autopep8 als Plugin hinzuzufügen, fügen Sie diese Repo-Definition zu Ihrer Konfiguration hinzu:
Repos: - Repo: https://github.com/hhatto/autopep8rev: ... # Wählen Sie das gewünschte Tag oder die gewünschte Revision aus oder führen Sie „pre-commit autoupdate“-Hooks aus: - ID: autopep8
Testfälle befinden sich in test/test_autopep8.py
. Sie können direkt über python test/test_autopep8.py
oder über tox ausgeführt werden. Letzteres ist nützlich zum Testen mit mehreren Python-Interpretern. (Wir testen derzeit gegen CPython-Versionen 3.8, 3.9, 3.10, 3.11 und 3.12. Wir testen auch gegen PyPy.)
Breitbandtests sind über test/acid.py
verfügbar. Dieses Skript führt autopep8 gegen Python-Code aus und prüft die Richtigkeit und Vollständigkeit der Codekorrekturen. Es kann überprüft werden, ob der Bytecode identisch bleibt. test/acid_pypi.py
nutzt acid.py
um mit den neuesten veröffentlichten Paketen auf PyPI zu testen.
pkg_resources.DistributionNotFound
Wenn Sie eine ältere Version von setuptools
verwenden, kann es sein, dass beim Versuch, autopep8
auszuführen, pkg_resources.DistributionNotFound
auftritt. Versuchen Sie, setuptools
zu aktualisieren, um dieses setuptools
-Problem zu umgehen:
$ pip install --upgrade setuptools
Verwenden Sie sudo
, wenn Sie auf dem System installieren.
PyPI
GitHub
Codecov