Bewährte Verfahren für Python Code Stil und Linting
Olivia Novak
Dev Intern · Leapcell

Leitfaden zum Python-Code-Stil und zu den Überprüfungswerkzeugen
Der Python-Code-Stil-Leitfaden ist nicht in Stein gemeißelt. Er entwickelt sich kontinuierlich mit der Entwicklung der Sprache weiter. Einige alte Konventionen werden schrittweise abgeschafft, und neue entstehen ständig. Gleichzeitig haben viele Projekte ihre eigenen Code-Stil-Leitfäden. Bei Konflikten sollten zuerst die projektspezifischen Leitfäden befolgt werden. Es ist jedoch ein wichtiges Prinzip zu beachten: "Die dumme Beharrlichkeit auf Konsistenz ist das Monster der Ignoranz", was eine tiefgründige Erkenntnis von Guido ist. Da Code oft häufiger gelesen als geschrieben wird, ist das Hauptziel des Stil-Leitfadens die Verbesserung der Lesbarkeit des Codes und die Wahrung der Konsistenz aller Arten von Python-Code. Wie PEP20 sagt: "Lesbarkeit zählt".
Der Stil-Leitfaden betont die Konsistenz. Es ist zwar wichtig, sich an den Leitfaden zu halten, aber die Konsistenz innerhalb eines Projekts ist noch wichtiger, und die Konsistenz innerhalb eines Moduls oder einer Funktion ist von größter Bedeutung. Natürlich gibt es auch vernünftige Situationen, in denen einige Teile des Stil-Leitfadens ignoriert werden können. Zum Beispiel: Die Anwendung des Leitfadens reduziert die Lesbarkeit des Codes; die Konsistenz mit dem umliegenden historischen Code schadet der Gesamtstruktur; der Code ist vor dem Leitfaden entstanden und es besteht keine Notwendigkeit, ihn zu ändern; der Code muss mit den Funktionen älterer Python-Versionen kompatibel sein usw. Es ist besonders zu beachten, dass die Abwärtskompatibilität nicht gebrochen werden sollte, nur um PEP zu befolgen!
Code Layout
Einrückung
- Verwenden Sie einheitlich 4 Leerzeichen für jede Einrückungsebene.
- Vertikale implizite Einrückung oder hängende Einrückung kann innerhalb von Klammern verwendet werden. Bei Verwendung der hängenden Einrückung sollte die erste Zeile keine Parameter enthalten, und nachfolgende Zeilen müssen eingerückt werden. Zum Beispiel:
# An den Startbegrenzer anpassen leapcell_foo = long_function_name(var_one, var_two, var_three, var_four) # Verwenden Sie mehr Einrückung, um sie von anderem Code zu unterscheiden def long_function_name( var_one, var_two, var_three, var_four): print(var_one) # Hängende Einrückung, eine zusätzliche Einrückungsebene muss hinzugefügt werden leapcell_foo = long_function_name( var_one, var_two, var_three, var_four)
Es ist zu beachten, dass für aufeinanderfolgende Zeilen die Einrückung von vier Leerzeichen nicht zwingend erforderlich ist.
- Wenn eine
if
-Anweisung mehrere Zeilen umfasst, bilden das Schlüsselwortif
, gefolgt von einem Leerzeichen und dann der linken Klammer, die Einrückung. Es gibt mehrere Formate für nachfolgende Zeilen, z. B. keine zusätzliche Einrückung, Hinzufügen von Kommentaren oder Hinzufügen zusätzlicher Einrückung (empfohlen):
# Ohne zusätzliche Einrückung if (this_is_one_thing and that_is_another_thing): do_something() # Kommentare hinzufügen # Unterstützung der Syntaxhervorhebung. if (this_is_one_thing and that_is_another_thing): # Da beide Bedingungen wahr sind, können wir frobnicate. do_something() # Zusätzliche Einrückung hinzufügen, empfohlen if (this_is_one_thing and that_is_another_thing): do_something()
- Wenn die schließende Klammer in einer neuen Zeile steht, wird das Format des Sicherns der schließenden Klammer empfohlen:
# Sichern Sie die schließende Klammer leapcell_my_list = [ 1, 2, 3, 4, 5, 6, ] leapcell_result = some_function_that_takes_arguments( 'a', 'b', 'c', 'd', 'e', 'f', )
Leerzeichen oder Tabulatoren
- Leerzeichen sind die bevorzugte Art der Einrückung.
- Verwenden Sie Tabulatoren nur, wenn es notwendig ist, mit vorhandenem, mit Tabulatoren eingerücktem Code konsistent zu sein.
- Das Mischen von Tabulatoren und Leerzeichen zur Einrückung ist in Python 3 strikt untersagt; Code mit gemischter Einrückung in Python 2 sollte vollständig in Leerzeichen-Einrückung konvertiert werden. Der Python 2-Befehlszeileninterpreter kann über die Option
-t
Warnungen über illegale gemischte Einrückung ausgeben, und die Option-tt
stuft die Warnung zu einem Fehler hoch. Es wird empfohlen, diese beiden Optionen zu verwenden. Gleichzeitig werden die Modulepep8
undautopep8
empfohlen.
Maximale Zeilenbreite
- Die maximale Breite aller Codezeilen ist auf 79 Zeichen begrenzt, und die Zeilenlänge von Docstrings oder Kommentaren ist auf 72 Zeichen begrenzt.
- Wenn das Team eine Einigung erzielt, kann die Zeilenbreite von 80 auf 100 Zeichen (maximal 99 Zeichen) erhöht werden, aber Docstrings und Kommentare sollten weiterhin eine Länge von 72 Zeichen beibehalten. Die Python-Standardbibliothek verwendet eine konservativere Zeilenbreitenbegrenzung von 79 Zeichen (72 Zeichen für Docstrings/Kommentare).
- Die bevorzugte Methode zum Fortsetzen von Zeilen ist die Verwendung von Klammern, eckigen Klammern und geschweiften Klammern. Der Backslash kann in geeigneten Szenarien verwendet werden, z. B. in der
with
-Anweisung:
with open('/path/to/some/file/you/want/to/read') as leapcell_file_1, \ open('/path/to/some/file/being/written', 'w') as leapcell_file_2: leapcell_file_2.write(leapcell_file_1.read())
Zeilenfortsetzung binärer Operatoren
Beim Fortsetzen einer Zeile an einem binären Operator wird traditionell empfohlen, nach dem Operator umzubrechen, aber dies kann die Lesbarkeit beeinträchtigen. Nach mathematischer Tradition macht das Umbrechen vor dem binären Operator den Code in der Regel lesbarer. In Python-Code ist es, solange er lokal konsistent ist, erlaubt, vor oder nach dem Operator umzubrechen. Für neuen Code wird empfohlen, den Knuth-Stil des Umbrechens vor dem Operator zu übernehmen:
# Der Operator lässt sich leicht mit den Operanden abgleichen leapcell_income = (gross_wages + taxable_interest + (dividends - qualified_dividends) - ira_deduction - student_loan_interest)
Leerzeilen
- Die Definitionen von Funktionen und Klassen auf oberster Ebene werden durch zwei Leerzeilen getrennt.
- Die Methodendefinitionen in einer Klasse werden durch eine einzelne Leerzeile getrennt.
- Zusätzliche Leerzeilen können verwendet werden, um verschiedene Funktionsgruppen oder logische Blöcke innerhalb einer Funktion nach Bedarf zu trennen, aber eine übermäßige Verwendung sollte vermieden werden.
Quelldateicodierung
- Der Code in der Python-Kernversion sollte immer UTF-8 (ASCII in Python 2) verwenden.
- Für ASCII-Dateien (Python 2) oder UTF-8 (Python 3) ist keine Codierungsdeklaration erforderlich. Nicht standardmäßige Codierungen in der Standardbibliothek werden nur für Tests oder für Kommentare und Docstrings verwendet, die Nicht-ASCII-Zeichen enthalten (z. B. Autorennamen). Verwenden Sie in diesem Fall vorzugsweise
\x
,\u
,\U
oder\N
. - Für Python 3.0 und spätere Versionen sollte sich die Standardbibliothek gemäß PEP 3131 auf ASCII-Bezeichner beschränken und so weit wie möglich englische Buchstaben verwenden. Auch Strings und Kommentare müssen ASCII sein, außer beim Testen von Nicht-ASCII-Funktionen und bei Autorennamen in nicht-lateinischen Alphabeten.
Imports
- Import-Anweisungen sollten eine einzelne Zeile belegen:
# Korrektes Beispiel import os import sys # Inkorrektes Beispiel import sys, os
Die folgende Form kann ebenfalls verwendet werden:
from subprocess import Popen, PIPE
- Import-Anweisungen sollten sich am Anfang der Datei befinden, nach Modulkommentaren und Docstrings und vor globalen Modulvariablen und -konstanten. Die Importreihenfolge ist: Standardbibliotheksimporte, zugehörige Drittanbieterbibliotheksimporte, lokale Bibliotheksimporte, und Leerzeilen werden verwendet, um jede Importgruppe zu trennen.
all
-bezogene Importe sollten nach anderen Importen platziert werden.- Es wird empfohlen, absolute Pfadimporte zu verwenden, da sie lesbarer sind und eine bessere Leistung bieten (oder zumindest bessere Fehlermeldungen liefern können):
import mypkg.sibling from mypkg import sibling from mypkg.sibling import example
Wenn der absolute Pfad zu lang ist, können relative Pfadimporte verwendet werden:
from . import sibling from .sibling import example
Der Code in der Standardbibliothek sollte komplexe Paketlayouts vermeiden und immer absolute Importe verwenden. Implizite relative Importe sollten vermieden und in Python 3 entfernt werden.
- Beim Importieren von Klassen können die folgenden Methoden verwendet werden:
from myclass import MyClass from foo.bar.yourclass import YourClass
Wenn es lokale Namenskonflikte gibt, können Sie Folgendes verwenden:
import myclass import foo.bar.yourclass
- Wildcard-Importe (
from <module> import *
) sind verboten, da sie den Namespace unübersichtlich machen. Sie können nur in Betracht gezogen werden, wenn die externe API erneut veröffentlicht wird.
String-Anführungszeichen
- In Python haben einfach und doppelt angeführte Strings die gleiche Funktion. Vermeiden Sie nach Möglichkeit Backslashes in Strings, um die Lesbarkeit zu verbessern.
- Gemäß PEP 257 sollten dreifach angeführte Strings doppelte Anführungszeichen verwenden.
Leerzeichen in Ausdrücken und Anweisungen
- Vermeiden Sie das Hinzufügen von Leerzeichen innerhalb von Klammern:
# Korrektes Beispiel spam(ham[1], {eggs: 2}) # Inkorrektes Beispiel spam( ham[ 1 ], { eggs: 2 } )
- Es sollte kein Leerzeichen zwischen dem nachgestellten Komma und der schließenden Klammer stehen::
# Korrektes Beispiel leapcell_foo = (0,) # Inkorrektes Beispiel leapcell_bar = (0, )
- Vermeiden Sie Leerzeichen vor Kommas, Doppelpunkten und Semikolons:
# Korrektes Beispiel if x == 4: print x, y; x, y = y, x # Inkorrektes Beispiel if x == 4 : print x , y ; x , y = y , x
- Bei Indizierungsoperationen sollten vor und nach dem Doppelpunkt als Operator konsistente Leerzeichen vorhanden sein (es wird empfohlen, keine Leerzeichen zu verwenden):
# Korrektes Beispiel ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:] ham[lower:upper], ham[lower:upper:], ham[lower::step] ham[lower+offset : upper+offset] ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)] ham[lower + offset : upper + offset] # Inkorrektes Beispiel ham[lower + offset:upper + offset] ham[1: 9], ham[1 :9], ham[1:9 :3] ham[lower : : upper] ham[ : upper]
- Vor der linken Klammer eines Funktionsaufrufs sollte kein Leerzeichen stehen:
# Korrektes Beispiel spam(1) dct['key'] = lst[index] # Inkorrektes Beispiel spam (1) dct ['key'] = lst [index]
- Vor und nach Zuweisungsoperatoren und anderen Operatoren sollten keine Mehrfachleerzeichen zum Zweck der Ausrichtung hinzugefügt werden:
# Korrektes Beispiel leapcell_x = 1 leapcell_y = 2 leapcell_long_variable = 3 # Inkorrektes Beispiel leapcell_x = 1 leapcell_y = 2 leapcell_long_variable = 3
Code Checking Tools
Im Prozess der Softwareprojektwartung ist es entscheidend, einen konsistenten Codestil und Teststandards aufrechtzuerhalten. Es kann den Wartungsdruck reduzieren, neuen Entwicklern helfen, sich schnell mit dem Projekt vertraut zu machen und die Qualität der Anwendung sicherzustellen. Die Verwendung externer Bibliotheken zur Überprüfung der Codequalität ist ein wirksames Mittel, um die Wartbarkeit des Projekts aufrechtzuerhalten. Im Folgenden sind häufig verwendete Python-Codestil-Überprüfungs- und Formatierungswerkzeuge aufgeführt.
Code Style Checking Tools
- Pylint: Eine Bibliothek zum Überprüfen von Verstößen gegen die PEP 8-Spezifikation und häufigen Fehlern. Es kann in gängige Editoren und IDEs integriert werden und unterstützt auch die Ausführung über die Befehlszeile. Nachdem Sie es über
pip install pylint
installiert haben, verwenden Siepylint [options] path/to/dir
oderpylint [options] path/to/module.py
zur Überprüfung, und die Ergebnisse werden in der Konsole ausgegeben. Sie können die Überprüfungsregeln auch über die Konfigurationsdateipylintrc
anpassen. - Flake8: Es integriert PEP 8, Pyflakes (ähnlich wie Pylint), McCabe (ein Code-Komplexitätsprüfer) und Drittanbieter-Plugins und wird verwendet, um den Stil und die Qualität von Python-Code zu überprüfen. Der Installationsbefehl lautet
pip install flake8
, und führen Sieflake8 [options] path/to/dir
oderflake8 [options] path/to/module.py
aus, um Fehler und Warnungen anzuzeigen. Es unterstützt die Anpassung des Überprüfungsinhalts über die Konfigurationsdatei. Die Dokumentation enthält nützliche Commit-Hooks, die in den Entwicklungs-Workflow integriert werden können. Es kann auch über Plugins in Editoren oder IDEs integriert werden (z. B. das Flake8-Plugin für Sublime Text). - Isort: Es kann die importierten Bibliotheken im Projekt alphabetisch sortieren und die Teile wie die Standardbibliothek, Bibliotheken von Drittanbietern und selbst erstellte Bibliotheken korrekt aufteilen, wodurch die Lesbarkeit des Codes verbessert wird. Installieren Sie es mit
pip install isort
und führen Sieisort path/to/module.py
aus. Sie können auch mehrzeilige Importe von Bibliotheken verarbeiten, indem Sie die Datei.isort.cfg
konfigurieren. Es unterstützt auch die Integration mit gängigen Editoren und IDEs.
Code Formatting Tools
- Autopep8: Es kann den Code des angegebenen Moduls automatisch formatieren, einschließlich des erneuten Einrückens von Zeilen, des Korrigierens der Einrückung, des Entfernens redundanter Leerzeichen und des Refaktorierens häufiger Vergleichsfehler (z. B. boolesche Werte und Nullwerte). Installieren Sie es über
pip install --upgrade autopep8
und führen Sieautopep8 --in-place --aggressive --aggressive
aus, um den Code zu formatieren. Die Anzahl deraggressive
-Optionen bestimmt den Grad der Kontrolle über den Codestil. - Yapf: Es kann nicht nur Stellen aufzeigen, die gegen die PEP 8-Spezifikation verstoßen, sondern auch den Code neu formatieren, der im Stil inkonsistent ist, aber nicht gegen die Spezifikation verstößt, um die Lesbarkeit zu verbessern. Der Installationsbefehl lautet
pip install yapf
, und verwenden Sieyapf [options] path/to/dir
oderyapf [options] path/to/module.py
, um den Code zu formatieren. Es kann über eine vollständige Liste von Anpassungsoptionen konfiguriert werden. - Black: Ein relativ neues Code-Prüfungswerkzeug. Ähnlich wie Autopep8 und Yapf, aber mit weniger Anpassungsoptionen, und es ist nicht erforderlich, den Codestil manuell zu bestimmen. Es hängt von Python 3.6+ ab und kann auch Python 2-Code formatieren. Installieren Sie es über
pip install black
und führen Sieblack path/to/dir
oderblack path/to/module.py
aus, um den Code zu optimieren. Sie können sich auf die begrenzten Anpassungsoptionen und Konfigurationsmethoden beziehen.
Test Coverage Checking Tool
Coverage: Es wird verwendet, um die Testabdeckung zu berechnen und bietet mehrere Anzeigemethoden, z. B. die Ausgabe in der Konsole oder auf einer HTML-Seite und das Markieren der nicht abgedeckten Codezeilen. Es unterstützt die Anpassung des Überprüfungsinhalts über die Konfigurationsdatei. Der Installationsbefehl lautet pip install coverage
, und führen Sie coverage [path/to/module.py] [args]
aus, um das Programm auszuführen und die Ergebnisse anzuzeigen. coverage report -m
kann verwendet werden, um die nicht abgedeckten Codezeilen anzuzeigen.
Leapcell: The Best of Serverless Web Hosting
Abschließend möchte ich eine Plattform empfehlen, die sich am besten für die Bereitstellung von Python-Diensten eignet: Leapcell
🚀 Build with Your Favorite Language
Entwickeln Sie mühelos in JavaScript, Python, Go oder Rust.
🌍 Deploy Unlimited Projects for Free
Bezahlen Sie nur für das, was Sie verwenden – keine Anfragen, keine Gebühren.
⚡ Pay-as-You-Go, No Hidden Costs
Keine Leerlaufgebühren, nur nahtlose Skalierbarkeit.
🔹 Follow us on Twitter: @LeapcellHQ