Python Auto Formatter: Autopep8 vs. Black (und einige praktische Tipps)
Hier ist das Fazit: Ich bevorzuge Schwarz als Auto-Formatierungstool, aber es gibt einige praktische Tipps (am Ende), die Sie beachten sollten, und es funktioniert am besten parallel zu einigen anderen Tools wie isort.
Einführung
Autopep8 und Black sind beide großartige Tools, um Ihren Python-Code automatisch so zu formatieren, dass er dem PEP 8 -Styleguide entspricht . Black hat 30,4.000 Sterne auf GitHub und ist wahrscheinlich das beliebteste Tool seiner Art, während autopep8 4,2.000 Sterne hat.
Einer der großen Unterschiede besteht darin, dass Black ein rechthaberischer Formatierer ist, was bedeutet, dass es immer die gesamte Codebasis in seinen eigenen Stil konvertiert, während autopep8 den Eingabestil in gewissem Maße beibehält und nur die notwendigen Teile korrigiert.
Ich habe beide Tools in meiner Arbeit verwendet und möchte mit Ihnen teilen, warum ich Schwarz gegenüber Autopep8 bevorzuge.
Probleme mit autopep8
1. Es sortiert die Importe aggressiv
Einige mögen dies als eine gute Sache ansehen, aber meiner Meinung nach sollte sich ein gutes Tool auf eine Sache und nur eine Sache konzentrieren. Als Formatierungswerkzeug sollte es nicht versuchen, die Reihenfolge des Codes zu ändern, und tatsächlich kann es manchmal Probleme verursachen.
Betrachten wir das folgende Beispiel. Dies ist zwar sys.path.appendim Allgemeinen keine gute Praxis, aber sagen wir einfach, wir möchten wirklich zuerst etwas tun, bevor wir den Rest der Module importieren.
Autopep8 würde das Skript wie folgt umschreiben:
Und das ist problematisch. Ein weiteres Beispiel, das mir einfällt, ist, dass wir, wenn wir das Backend von matplotlib für ein Linux-Terminal aktivieren möchten, das Backend matplotlib.use("agg") vor dem pyplot import festlegen müssten from matplotlib import pyplot as plt.
Im Gegensatz dazu ändert Schwarz den obigen Beispielcode nicht. Schwarz formatiert nur und die Semantik des Codes bleibt genau gleich. Mit anderen Worten, Schwarz sortiert Ihre Importe nicht und ändert nicht die Reihenfolge Ihres Codes. (und wir können die Aufgabe des Sortierens von Importen einem anderen großartigen Werkzeug überlassen , bitte lesen Sie weiter!)
Sie können das Problem immer noch lösen, indem Sie # nopep8einige Snippets Ihres Codes hinzufügen und autopep8 explizit anweisen, es nicht zu berühren:
In diesem Fall funktioniert es, aber ich habe festgestellt, dass die # nopep8Ausschlussregel nicht auf Kommentare angewendet wird, z. B. würde autopep8 das Folgende immer noch ### some comment # nopep8in konvertieren # some comment # nopep8.
Andererseits bearbeitet Black keine Kommentare und Docstrings, und Sie können einen Teil Ihres Codes von der Formatierung ausschließen, indem Sie zwei Kommentarzeilen vor # fmt: offund # fmt: onnach Ihrem Codeblock hinzufügen.
Wie auch immer, es ist nicht sehr pythonisch, oder?
2. Es erzwingt die Einrückung nicht richtig
Der Standardeinzug von Autopep8 ist auf die Tabulatorgröße Ihres Editors eingestellt, und Sie können den Wert angeben, indem Sie die Option übergeben autopep8 --indent-size 4 myfile.py. Alles ist gut, aber autopep8 setzt nur diesen Eingabewert, um den Einzug für den Anfang jeder Anweisung festzulegen, aber die Einzugsgröße innerhalb von Klammern wird immer auf die Standard-Tabulatorgröße gesetzt.
Schauen wir uns dieses Beispiel an, in dem der Codeeinzug 1 ist und die Standard-Tabulatorgröße meines Editors 4 ist.
Nachdem wir mit autopep8 autopep8 --indent-size 3 format_02_raw.py -i (-i bedeutet an Ort und Stelle) den Einzug auf 3 gesetzt haben , erhalten wir Folgendes:
Wir können sehen, dass der Einzug in der ersten Funktion korrekt auf 3 gesetzt ist, aber alles in Klammern (in diesem Fall die Druckanweisung und die Matrix) wird stattdessen auf die Standard-Tabulatorgröße 4 gesetzt.
Ich habe das herausgefunden, weil die Standard-Tabulatorgröße in meiner Arbeitsumgebung 2 ist und ich den Einzug von 4 bevorzuge. Es mag trivial klingen, aber warum die unnötige Inkonsistenz riskieren? Schwarz erlaubt Ihnen nicht, die Einzugsgröße zu konfigurieren, da es immer den Einzug an allen Stellen auf 4 setzt, was mich überhaupt nicht stört.
Schwarz richtig einsetzen
Schwarz setzt einen eigenen Stil um, den manche mögen und manche nicht. Ich mag es sehr, da es im Allgemeinen sehr sauber und lesbar ist, aber es gibt zwei Dinge, die man beachten sollte.
1. Verwenden Sie ein abschließendes Komma
Das folgende Beispiel zeigt wahrscheinlich einen der häufigsten Gründe, warum manche Leute Schwarz nicht mögen. Schauen wir uns das Vorher und Nachher an:
Es ist ärgerlich, aber bevor Sie wütend werden, nehmen wir einige kleine Änderungen am Code vor und sehen, wie Schwarz sein Verhalten ändert:
Ja, Schwarz verwendet nachgestellte Kommas, um zu entscheiden, ob die Elemente zusammengefügt werden oder in neuen Zeilen bleiben. Wenn ein Array-ähnliches Element ohne nachgestelltes Komma endet, egal ob es sich um eine Liste, eine Matrix oder ein Wörterbuch handelt, versucht Schwarz immer, es in eine Zeile zu verzerren; Wenn es die Länge der Zeile überschreitet, fügt Schwarz seinen Inhalt in neue Zeilen ein und fügt ein nachgestelltes Komma für Sie hinzu . Wenn das Element ein nachgestelltes Komma enthält, trennt Schwarz seinen Inhalt für Sie in neue Zeilen .
Kurz gesagt, es gibt immer ein abschließendes Komma, wo immer der Inhalt eines Array-ähnlichen Elements in neuen Zeilen steht. Ich denke, das macht Sinn, und im Allgemeinen sind nachgestellte Kommas eine gute Praxis, da sie den Code einfacher zu warten machen und sauber generieren, git diffwenn Sie Änderungen vornehmen. Wenn Sie also nicht möchten, dass Schwarz Ihren Code in eine Zeile umbricht, fügen Sie am Ende ein Komma hinzu!
Bonus-Tipps: Wenn ich SQL-Abfragen schreibe, würde ich schreiben
SELECT column_a
,column_b
,column_c
FROM some_table
SELECT column_a,
column_b,
column_c
FROM some_table
2. Geben Sie bei Bedarf die Zeilenlänge an
Das einzige, was mir am Black-Code-Stil bisher nicht gefällt, sind die langen if-Anweisungen, wie das folgende Beispiel zeigt:
Es erzwang Konsistenz, opferte aber die Lesbarkeit. Die Standardzeilenlänge von Schwarz ist 88, aber manchmal habe ich etwas längere Anweisungen und möchte nicht, dass sie so formatiert werden.
Meine Lösung besteht darin, eine etwas längere Leitungslänge zuzulassen. Wir können die Zeilenlänge mit --line-lengthoder angeben -l, und wenn wir die Zeilenlänge auf 100 setzen black -l 100 format_05_raw.py, wird das obige Beispiel nicht neu formatiert. Meiner Erfahrung nach würde eine Zeilenlänge von etwa 100 für die meisten langen Anweisungen passen und gleichzeitig eine gute Lesbarkeit des Codes beibehalten (obwohl Sie wirklich in Betracht ziehen sollten, Ihre Anweisung umzuschreiben, wenn sie mehr als 100 Zeichen lang ist), aber dies muss natürlich jedes Team entscheiden .
Autopep8 hat auch ein solches Flag --max-line-length, da autotpep8 jedoch dazu neigt, den ursprünglichen Codestil beizubehalten, reagiert das Formatierungsergebnis viel weniger empfindlich auf die angegebene Zeilenlänge als Schwarz.
3. Verwenden Sie schwarz mit isort
Wie ich bereits erwähnt habe, sortiert Black Ihre Importe nicht, und wir können dafür isort (5,4.000 Sterne auf GitHub) verwenden. Schauen wir uns ein kurzes Beispiel an, was isort tun kann:
sys.path.appendEs ist ordentlich und bringt unser Beispiel nicht durcheinander .
Beachten Sie, dass es einige geringfügige Unterschiede zwischen der Art und Weise gibt, wie isort und black Importe organisieren, und wir können isort anweisen, die Importe gemäß dem Black-Code-Stil zu sortieren isort --profile black format_06_raw.py.
Wir haben jetzt einen ziemlich guten Arbeitsablauf: Verwenden Sie zuerst isort, um die Importe zu sortieren, und verwenden Sie dann black, um unseren Code zu formatieren. Wir können die beiden Schritte in Makefile kombinieren:
format:
isort --profile black src/
black -l 100 src/
Fazit
In diesem Artikel haben wir zwei beliebte Tools zur automatischen Formatierung in Python verglichen – autopep8 und black. Ich habe erklärt, warum ich Schwarz bevorzuge und wie ich es gerne verwende, und ich hoffe, das ist hilfreich.
Dies ist auch das erste Mal, dass ich einen Artikel auf Medium schreibe, bitte zögern Sie nicht, mir zu klatschen, wenn es Ihnen gefällt, und vergessen Sie nicht, unten Ihre Kommentare zu hinterlassen, und wir sehen uns beim nächsten Mal!

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































