Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Code Stil und Konventionen

Make your code consistent through style conventions. For interactive reading and executing code blocks Binder and find b08-pystyle.ipynb, or install Python and JupyterLab locally.

Atmen Sie tief ein, nehmen Sie aus und schauen Sie sich an, was Sie bisher aus einer neuen Perspektive gelernt haben. Nach diesem Kapitel lohnt es sich, einen weiteren Blick auf Ihren alten Code zu werfen und ihn robust zu formatieren. Die hier vorgestellten Style-Richtlinien gehen über visuelle Ästhetik und Hilfe beim Schreiben effektiver Code.

incubate to solve Python programming problems

Hintergrund und PEP

Dieser Stilführer zeigt Teile des PEP 8 - Style Guide for Python Code von Guido van Rossum, Barry Warsaw und Nick Coghlan. Das vollständige Dokument ist unter python.org erhältlich und in diesem Kapitel sind nur Aspekte mit Relevanz für die in diesem eBook gezeigten Anwendungen aufgeführt.

Was ist ein PEP? PEP steht für Python Enhancement Proposal*. Ein PEP ist ein Designdokument, das der Python-Community Informationen zur Verfügung stellt oder eine vorgeschlagene Funktion, Prozess oder damit verbundene Änderung beschreibt. Es gibt viele PEPs, darunter Standards-Track-, Informations- und Prozessvorschläge. Dieses Kapitel zeigt Empfehlungen von PEP 8, der Stilführer für Python-Code, von Guido van Rossum, Barry Warsaw und Alyssa Coghlan.

Viele IDEs, einschließlich PyCharm oder VS-Code, bieten Auto-Vervollständigung und Tooltips mit PEP-Stil Anleitung, um konsequente Programmierung zu unterstützen. So, wenn Ihre IDE unterstreicht alles in Ihrem Skript, überprüfen Sie den Grund dafür und prüfen, den Code entsprechend zu ändern.

Das Zen von Python

Werden wir spirituell? Weit davon. Das Zen von Python ist ein Informationsblatt PEP (20) von Tim Peters, um Programmierer zu leiten. Es ist ein paar Linien, die gute Praxis bei der Codierung zusammenfassen. Python’s Easter Egg import this druckt das Zen von Python in jedem Python Dolmetscher:

import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Code Layout

Maximale Linienlänge

PEP 8 empfiehlt, Codezeilen auf 79 Zeichen zu begrenzen. Der Text in Kommentaren und docstrings sollte auf 72 Zeichen beschränkt sein. Ein Team kann sich auf eine Codezeilengrenze von bis zu 99 Zeichen einigen, sofern Kommentare und Zeichen auf 72 Zeichen beschränkt bleiben.

Identifizierung

Indentation groups statements into suites controlled by constructs such as for, if, while, try, with, def, and class. PEP 8 recommends four spaces per indentation level. Indentation does not by itself create a new variable scope: names assigned in an if or for suite remain in the surrounding scope. Functions, classes, modules, and some comprehensions have their own scoping rules.

for i in range(1, 2):
  print("I'm one level indented.")
  if i == 1:
	  print("I'm two levels indented.")
I'm one level indented.
I'm two levels indented.

Weil lange Zeilen von Code schlechte Praxis sind, müssen wir manchmal Zeilenumbrüche verwenden, wenn wir beispielsweise eine list zuweisen oder eine Funktion anrufen. In diesen Fällen wird auch die nächste, weiterführende Linie eingerückt und es gibt verschiedene Optionen, um Multi-Line-Beträge zu identifizieren. Hier möchten wir den Stilcode der Verwendung eines Öffnungsbegrenzers für die Einbuchtung verwenden:

a_too_long_word_list = ["Do", "not", "hard-code", "something", "like", "this.",
                        "There", "are", "better", "ways."]
a_better_indented_list = [
    "Do",
    "not",
    "hard-code",
    "something",
    "like",
    "this.",
    "...",
    ]

*Recall: PyCharm, VS-Code und viele andere IDEs automatisch Layout-Einbuchtung.

Line Breaks of Expressions mit binären Operatoren

Wenn binäre Operatoren Teil eines Ausdrucks sind, der die maximale Zeilenlänge von 79 Zeichen überschreitet, sollte der Zeilenbruch vor den binären Operatoren sein.

import pandas as pd

dummy_df = pd.get_dummies(
  pd.Series(["variable1", "parameter2", "sensor3"]),
  dtype=int,
)
print(dummy_df.head(3))

dum_sum = (
  dummy_df["variable1"]
  + dummy_df["parameter2"]
  - dummy_df["sensor3"]
)
   parameter2  sensor3  variable1
0           0        0          1
1           1        0          0
2           0        1          0

Leere Linien

Um Code-Blöcke zu trennen, schlagen Sie den Enter Schlüssel oft ist eine sehr einladende Option. Die zufällige und stimmungsgesteuerte Verwendung von leeren Linien führt jedoch zu unstrukturiertem Code. Deshalb bieten PEP 8 Autoren auch Hinweise auf die Verwendung von Leerzeilen:

  • Surround-Klassendefinitionen und Top-Level-Funktionen (d.h. Funktionen, bei denen die def-line nicht eingezeichnet ist) mit zwei Leerzeilen.

  • Umgebungsmethoden (z.B. Funktionen innerhalb einer Klasse) mit einer leeren Linie.

  • Verwenden Sie leere Zeilen sparsam in allen anderen Code, um logische Abschnitte anzuzeigen.

# blank 1 before top-level function
# blank 2 before top-level function
def top_level_function():
    pass
# blank 1 after top-level function
# blank 2 after top-level function

Leere (Weißräume)

Vermeiden Sie unnötigen Weißraum unmittelbar innerhalb von Klammern, Klammern oder Klammern; vor Kommas, Semikolonen und gewöhnlichen Kolonen; oder zwischen einem Funktionsnamen und seiner Argumentliste. Schreiben Sie function(e1, e2), (1,),a_dict = {a_key: a_value} und def fun(arg=0.0):.

Verwenden Sie Leerzeichen um Zuordnung, Vergleich und Boolean Operatoren. Für arithmetische Ausdrücke fügen Sie Leerzeichen um die niedrigsten Vorgänger und nutzen Sie das Urteil, um die Vorhergehende klar zu machen; zum Beispiel hypot2 = x*x + y*y.

Pakete und Module

Einfuhr

Importe erscheinen normalerweise nach dem Modul-Docstring und vor Modul global. Gruppen Sie sie in dieser Reihenfolge mit einer leeren Linie zwischen Gruppen: Standard-Bibliothek, verwandte Drittpakete, lokale Anwendung oder Bibliothek Importe. Normale Einfuhren auf getrennte Linien setzen und Wildcard-Importe vermeiden. Jeder Import sollte eine eigene Linie haben und die Verwendung des Kommazeichens für mehrere Importe vermeiden:

import os
import sys

import numpy as np

from my_package import my_module

Namenspakete und Skript

Neue, benutzerdefinierte Pakete oder Module sollten kurze und All-Lowercase-Namen haben, wo Unterpunkte verwendet werden können, um die Lesbarkeit zu verbessern (für Pakete entmutigt).

Bemerkungen

Block und Inline Kommentare

Blockkommentare werden auf die gleiche Ebene wie der Code, den sie beschreiben, und jede Zeile beginnt mit # . Verwenden Sie Inline-Kommentare sparsam. Ein inline Kommentar erscheint auf der gleichen Zeile wie ein Statement, wird von ihm durch mindestens zwei Leerzeichen getrennt und beginnt mit # .

Ärzte

Ein Docstring ist ein String-Literal, das als erste Aussage in einem Modul, Funktion, Klasse oder Verfahren auftritt. Es wird über das Attribut __doc__ des Objekts verfügbar. PEP 257 empfiehlt dreifache doppelte Zitate. Zum Beispiel:

a_list = [1, 2]
print(a_list.__doc__)
Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list.
The argument must be an iterable if specified.

Beim Schreiben einer Python-Funktion werden die Docstrings unmittelbar nach der def ...-Linie mit dreifachen Doppelquoten eingeführt:

def let_there_be_light(*args, **kwargs):
  """Print a sunrise message and return `True`.

  Args:
	  *args: Positional arguments accepted but not used.
	  **kwargs: Keyword arguments accepted but not used.

  Returns:
	  `True` in all cases.
  """
  print("Sunrise")
  return True

print(let_there_be_light.__doc__)

    Bright function accepting any input argument with indifferent behavior.
    :param an_input_argument: STR or anything else
    :param another_input_argument: FLOAT or anything else
    :return: True (in all cases)
    

Beachten Sie, dass die Empfehlungen zu Docstrings mit PEP 257 anstatt PEP 8.

Bezeichnung Konventionen

Definition von Name Styles

Die Namenskonventionen verwenden die folgenden Stile (Quelle: python.org):

  • Klassen verwenden normalerweise CapWords, zum Beispiel MyClass.

  • Benutzerdefinierte Ausnahmeklassen folgen dem Klassen-naming-Übereinkommen und verwenden normalerweise den suffix Error, wenn sie einen Fehler darstellen, z.B. ConfigurationError.

  • Funktionen, Methoden und Variablen verwenden bei Bedarf kleinere Wörter, die durch Unterstriche getrennt werden.

  • Konstanten verwenden normalerweise Großbuchstaben, die durch Unterstriche getrennt werden, z.B. WATER_DENSITY = 1000.

Einige variable Namensformate lösen ein bestimmtes Verhalten von Python aus:

  • _single_leading_underscore Variablen geben einen schwachen internen Gebrauch an und werden nicht mit from module import *

  • __double_leading_underscore Variablen rufen den Namen mangling in den Klassen an (z.B. eine Methode namens __dlu der Klasse MyClass wird in _MyClass__dlu eingebunden)

  • __double_leading_and_trailing_underscore__ Variablen sind magic Objekte oder Attribute in benutzergesteuerten Namespaces (z.B. __init__ oder __call__ in Klassen)
    Verwenden Sie nur dokumentierte magische Attribute und erfinden sie nie. Lesen Sie mehr über magische Methoden im Kapitel unter Python classes.

  • single_trailing_underscore_ Variablen werden verwendet, um Konflikte mit Python Keywords zu vermeiden (z.B. MyClass(class_='AnotherClass'))

Objektbezeichnungen

Verwenden Sie die oben definierten Stile für die Benennung von Python-Elementen wie folgt:

  • Klassen: CamelCase (CapWords) nur Buchstaben wie MyClass

  • Konstanten: Nur UPPERCASE Buchstaben, bei denen Unterstriche die Lesbarkeit verbessern können (z.B. auf Modulebene verwenden, um Wasserdichte RHO = 1000) zuzuweisen.

  • Ausnahmen: CamelCase (CapWords) Buchstaben nur (Ausnahmen sollten vordefiniert Error-Kurse sein; typischerweise verwenden Sie die suffixError (z.B. TypeError)

  • Funktionen: Nur lowercase Buchstaben, bei denen Unterpunkte die Lesbarkeit verbessern können; manchmal gilt mixedCase, um eine rückständige Kompatibilität der vorherrschenden Stile sicherzustellen

  • Methoden (Klassenfunktion, nichtöffentlich): _lowercase Buchstaben nur mit einem führenden Unterpunkt, wo Unterpunkte die Lesbarkeit verbessern können

  • Methoden (Klassenfunktion, öffentlich): Nurlowercase Buchstaben, bei denen Unterpunkte die Lesbarkeit verbessern können

  • Module: Nur lowercase Buchstaben, wo Unterpunkte die Lesbarkeit verbessern können

  • Pakete: Nur lowercase Buchstaben, bei denen Unterstriche entmutigt werden

  • Variablen: Nur lowercase Buchstaben, wo Unterpunkte die Lesbarkeit verbessern können

  • Variablen (global): Nur lowercase Buchstaben, bei denen Unterpunkte die Lesbarkeit verbessern können; beachten Sie, dass “global” nur innerhalb eines Moduls auf eine variable Nutzung beschränken sollte.

Mehr Code Style Empfehlungen

Um die Code-Kompatibilität und Programmeffizienz zu gewährleisten, bietet der PEP 8 Style Guide weitere allgemeine Empfehlungen (weitere Informationen in der Python docs):

  • Geben Sie bei der Erstellung einer benannten Funktion eine def-Anweisung vor; geben Sie keinen Lambda-Ausdruck direkt einem Namen zu. Eine kurze Lambda kann bei direkter Weitergabe als Argument geeignet sein, z.B. items.sort(key=lambda item: item.name).

  • Wenn Ausnahmen erwartet werden, verwenden Sie try -exceptklauseln (siehe Abschnitt errors and exceptions).

  • Stellen Sie sicher, dass Methoden und Funktionen Objekte konsequent zurückgeben, zum Beispiel:

import numpy as np


def a_function_with_return(x):
  if x > 0:
	  return np.sqrt(x)
  return np.nan

Erfolgsprüfung lernen

Nehmen Sie den Lernerfolgstest für dieses Jupyter Notebook.