12 Python-Codestile

12 Python-Codestile für die Produktion

vg

In den Projekten legen wir großen Wert darauf, unseren Code so leserlich und verständlich wie möglich zu schreiben. Um dies zu erreichen, setzen wir auf verschiedene Praktiken, die Teil der 12 Python-Codestile für die Produktion sind, darunter:

  • Verwendung von aussagekräftigen und längeren Variablennamen (statt a, b & c)
  • Klar benannte Funktionen
  • Umfangreiche Kommentare und Dokumentation zur Erklärung des Codes
  • Ständige Verwendung von Typhinweisen
  • Längere und detailliertere Zeichenketten

Diese Praktiken zeigen, wie sich das Code-Styling kontinuierlich weiterentwickelt, um den Anforderungen an einen gut strukturierten Code gerecht zu werden. Im Folgenden stelle ich einige der wichtigsten Codestile vor, die ich in den letzten Jahren aus verschiedenen Arbeitsumgebungen übernommen habe.

1) Tupel-Auspacken mit Klammern

Hier ist ein normales Entpacken von Tupeln:

Tupel-Auspacken

In produktionsreifem Code verwenden wir in der Regel keine Variablennamen wie oder b – stattdessen werden unsere Variablennamen viel länger und aussagekräftiger.

Daher können wir Klammern verwenden, um das Entpacken von Tupeln wie folgt zu erleichtern:

Tupel-Auspacken Lösung

Beachten Sie, dass unser Tupel-Entpacken auf diese Weise viel längere (und aussagekräftigere) Variablennamen aufnehmen kann

Ein realistischeres Beispiel:

Tupel-Auspacken Beispiel

2) Listen Sie Verständnisse über mehrere Zeilen auf

So sieht normales Listenverständnis aus:

liste problem

Im Produktionscode verwenden wir normalerweise nicht den Variablennamen i – unsere Variablen sind in der Regel viel länger und beschreibend, so dass wir nicht das gesamte Listenverständnis in eine Codezeile packen können.

Wie ich den obigen Code neu schreiben würde:

liste lösung

Ein realistischeres Beispiel:

liste beispiel

3) Kombinieren von Zeichenketten mit eckigen Klammern

Zeichenfolgen in Produktionsqualität passen in der Regel nicht in eine Zeile, da sie so ausführlich sind. Und so kombinieren wir sie mit Klammern.

string klammer problem

Hinweis: Innerhalb von eckigen Klammern werden Zeichenfolgenliterale (in Anführungszeichen) automatisch addiert, und wir müssen dazu den Operator + nicht verwenden

4) Mehrzeilige Methodenverkettung mit Hilfe von Klammern

Normale Methodenverkettung:

Mehrzeilige Methodenverkettung problem

In produktionsfähigem Code sind die Methodennamen die meiste Zeit viel länger, und wir haben mehr Methoden, die miteinander verkettet sind.

Auch hier verwenden wir Klammern, um all diese Dinge in mehrere Zeilen zu packen, anstatt einen der Methodennamen oder Variablennamen zu kürzen.

Mehrzeilige Methodenverkettung lösung

Beachten Sie, dass wir bei der Methodenverkettung in eckigen Klammern nicht verpflichtet sind, das Zeichen \ für einen expliziten Zeilenumbruch zu verwenden

5) Indizieren verschachtelter Wörterbücher

Normale Methode zum Indizieren von verschachtelten Wörterbüchern:

dictonary problem

Hier gibt es einige Probleme:

  • Wörterbücher in produktionstauglichem Code verfügen über viel mehr Verschachtelungsebenen
  • Wörterbuchschlüssel haben viel längere Namen
  • In der Regel ist es nicht möglich, den gesamten verschachtelten Indizierungscode in eine Zeile zu quetschen.

Daher teilen wir es in mehrere Zeilen wie folgt auf:

dictonary lösung

Und wenn dies nicht ausreicht, teilen wir unseren Indizierungscode in mehrere Zeilen auf:

dictonary beispiel

Oder wenn wir das immer noch schwer zu lesen finden, können wir dies tun:

dictonary beispiel 2

6) Schreiben von lesbaren und informativen Funktionen

Wie wir früher als Studenten Funktionen geschrieben haben:

^ PRs, die solchen Code enthalten, werden höchstwahrscheinlich abgelehnt

  • Der Funktionsname ist nicht beschreibend
  • Parametervariablennamen sind falsch
  • keine Typhinweise, so dass wir nicht auf den ersten Blick wissen, welche Datentypen die einzelnen Parameter sein sollen
  • keine Typhinweise, so dass wir auch nicht wissen, was unsere Funktion zurückgeben soll
  • kein Docstring, also müssen wir ableiten, was unsere Funktion tut

So schreiben wir Funktionen in produktionstauglichem Python-Code

  • Der Funktionsname sollte beschreibend sein
  • Parameternamen sollten aussagekräftiger sein als z.B. a, b, c
  • Jeder Parameter sollte über einen Typhinweis verfügen
  • Der Rückgabetyp der Funktion sollte ebenfalls enthalten sein
  • Ein DocString, der detailliert beschreibt, was die Funktion tut, welche Parameter sie übernimmt und welche Ausgabe sie ausgibt, sollte als Zeichenfolge in drei Anführungszeichen eingefügt werden.

7) Reduzierung der Eindringebenen so weit wie möglich

Hier ist eine for-Schleife. Wenn unsere Bedingung erfüllt ist, tun wir etwas.

^ Einige Kollegen und leitende Ingenieure könnten tatsächlich an diesem Code vorbeischauen — er kann besser geschrieben werden, indem die Einrückungsebenen reduziert werden.

Lassen Sie uns dies neu schreiben, während wir die Einrückungsebene für do_something() reduzieren.

Beachten Sie, dass die Einrückungsebene für do_something() um 1 Ebene reduziert wurde, wobei nur if not condition anstelle von if condition verwendet wird.

In produktionsreifem Code kann es viel mehr Einrückungsebenen geben, und wenn es zu viele gibt, wird unser Code nervig und unlesbar. Dieser Trick ermöglicht es uns, unseren Code ein wenig aufgeräumter und menschenlesbarer zu machen.

8) Boolesche Bedingungen mit Klammern

Hier ist eine if-Anweisung mit 3 Bedingungen, die mit dem Schlüsselwort and verknüpft sind.

In produktionsfähigem Code werden die Bedingungen länger, und es können mehr Bedingungen vorhanden sein. Eine Möglichkeit, dies zu lösen, besteht darin, diese riesige Bedingung in eine Funktion umzuwandeln.

Oder wenn wir der Meinung sind, dass es nicht notwendig ist, nur dafür eine neue Funktion zu schreiben, können wir unsere bedingten Anweisungen in eckigen Klammern schreiben.

Auf diese Weise sind wir nicht gezwungen, eine neue Funktion oder Variable nur für diese eine bedingte Anweisung zu schreiben, und dennoch sind wir in der Lage, sie ordentlich und lesbar zu halten.

Manchmal bevorzuge ich es sogar, es so zu schreiben, obwohl dies nur auf persönlichen Vorlieben basiert:

9) Schutz vor None-Werten

Normaler Code, der auf ein geschachteltes Attribut eines Objekts zugreift.

Einige Probleme mit diesem Code, die dazu führen können, dass unsere PR abgelehnt wird:

  • Wenn dog auf None gesetzt ist, erhalten wir eine Fehlermeldung
  • Wenn dog.owner auf None gesetzt ist, erhalten wir auch eine Fehlermeldung
  • Im Wesentlichen schützt dieser Codeblock nicht vor der Möglichkeit, dass dog oder dog.owner None sein könnte.

In produktionsfähigem Code müssen wir uns aktiv vor solchen Fällen schützen. So würde ich diesen Code umschreiben.

Die and-und-oder-Operatoren in Python sind Kurzschlussoperatoren, was bedeutet, dass sie die Auswertung des gesamten Ausdrucks beenden, sobald sie eine klare Antwort haben.

  • if dog ist None, endet unser Ausdruck mit „if dog
  • Wenn Hund nicht None ist, aber dog.owner None ist, endet unser Ausdruck mit „if dog and dog.owner
  • Wenn wir keine None-Werte haben, wird dog.owner.name erfolgreich aufgerufen und zum Vergleichen mit der Zeichenfolge „bob“ verwendet

Auf diese Weise haben wir einen zusätzlichen Schutz gegen die Möglichkeit, dass entweder dog oder dog.owner keine Werte haben könnten.

10) Schutz vor Iteration durch None-Werte

Hier erfahren Sie, wie wir über einige iterierbare Elemente iterieren könnten (z. B. list, dict, tupel usw.)

Ein Problem dabei ist, dass es nicht davor schützt, dass mylist None ist – wenn mylist zufällig None ist, erhalten wir eine Fehlermeldung, da wir nicht durch None iterieren können.

So würde ich diesen Code verbessern:

Der Ausdruck „mylist oder None“

  • Gibt mylist zurück, wenn es wahr ist (z. B. nicht leer iterierbar)
  • Gibt [] zurück, wenn mylist falsch ist (z.B. Keine oder leer iterierbar)

Wenn mylist also None ist, gibt der Ausdruck „mylist oder None“ stattdessen [ ] zurück, und es kommt zu keiner unerwünschten Ausnahme.

11) Interne Funktionen beginnen mit _

Hier ist eine Beispielklasse. Hier verwendet die run-Methode die anderen Methoden clean & transform

Bei produktionsreifem Code streben wir danach, so explizit wie möglich zu sein, und versuchen daher, zwischen internen und externen Methoden zu unterscheiden.

  • Externe Methoden — Methoden, die von anderen Klassen und Objekten verwendet werden sollen
  • Interne Methoden — Methoden, die von der Klasse selbst verwendet werden sollen

Gemäß der Konvention empfiehlt es sich, dass interne Methoden mit einem Unterstrich beginnen _

Wenn wir den obigen Code neu schreiben würden, würden wir Folgendes erhalten:

Hinweis: Wenn Sie einen Unterstrich vor einen Methodennamen einfügen, wird dieser nicht vor anderen Klassen und Objekten verborgen. Tatsächlich gibt es funktional keinen Unterschied.

12) Dekorateure für allgemeine Funktionalität

Hier ist eine Klasse mit 3 Funktionen, und jede Funktion führt unterschiedliche Aufgaben aus. Beachten Sie jedoch, dass es ähnliche Schritte für die verschiedenen Funktionen gibt – den try-except-Block sowie die Protokollierungsfunktion.

Eine gute Methode, um die Menge an wiederholtem Code zu reduzieren, besteht darin, stattdessen eine Decorator-Funktion zu schreiben, die die allgemeine Funktionalität enthält.

Auf diese Weise müssen wir, wenn wir den allgemeinen Code (try-except und Logging-Code) aktualisieren möchten, ihn nicht mehr an 3 Stellen aktualisieren – wir müssen nur unseren Decorator-Code aktualisieren, der die gemeinsame Funktionalität enthält.

Fazit

Es ist wichtig, Code nicht nur funktional, sondern auch lesbar und wartbar zu gestalten, insbesondere in einer professionellen Entwicklungsumgebung. Der Fokus liegt auf der Verbesserung der Verständlichkeit durch klare, aussagekräftige Variablen- und Funktionsnamen, die Verwendung von Typhinweisen und umfassender Dokumentation. Produktionsreifer Python-Code erfordert zusätzlich eine präzise Strukturierung, um die Komplexität zu reduzieren, zum Beispiel durch das Aufteilen langer Ausdrücke in mehrere Zeilen, den gezielten Einsatz von Klammern zur besseren Lesbarkeit und den Schutz vor Fehlern durch None-Werte.

Darüber hinaus werden 12 Python-Codestile wie der Umgang mit verschachtelten Strukturen, die Nutzung von Decorators zur Vermeidung von Code-Duplikation und die Handhabung von internen und externen Methoden durch Namenskonventionen vorgestellt. Diese Ansätze verbessern nicht nur die Lesbarkeit des Codes, sondern auch dessen Wartbarkeit und Fehlerresistenz. Insgesamt wird ein klarer Überblick über die Prinzipien gegeben, die notwendig sind, um Python-Code auf ein professionelles Niveau zu heben.

Weiterer Beitrag: Was ist Internet of Things?

com

Newsletter Anmeldung

Bleiben Sie informiert! Wir informieren Sie über alle neuen Beiträge (max. 1 Mail pro Woche – versprochen)