Wie man lesbaren Code schreibt mit PEP8 – Teil 2

Code-Layout

„Schön ist besser als hässlich.“

– Das Zen von Python

Die Art und Weise, wie man Code strukturiert, hat einen großen Einfluss auf die Lesbarkeit.

Leerzeilen

Vertikaler Leerraum, oder Leerzeilen, können die Lesbarkeit des Codes erheblich verbessern. Aneinander gereihter Code kann erdrückend und schwer zu lesen sein. Ähnlich verhält es sich mit zu vielen Leerzeilen in Ihrem Code, die ihn sehr spärlich erscheinen lassen, so dass der Leser möglicherweise mehr als nötig scrollen muss. Im Folgenden findet man drei wichtige Richtlinien für die Verwendung von vertikalem Leerraum.

Man umgibt Top-Level-Funktionen und -Klassen mit zwei Leerzeilen. Top-Level-Funktionen und -Klassen sollten relativ eigenständig sein und separate Funktionen behandeln. Es ist sinnvoll, zusätzlichen vertikalen Raum um sie herum zu platzieren, damit klar ist, dass sie getrennt sind:

class MyFirstClass:
    pass


class MySecondClass:
    pass


def top_level_function():
    return None

Man umgibt Methodendefinitionen innerhalb von Klassen mit einer einzelnen Leerzeile. Innerhalb einer Klasse sind die Funktionen alle miteinander verbunden. Es ist gute Praxis, nur eine einzige Zeile zwischen ihnen zu lassen:

class MyClass:

    def first_method(self):
        return None

    def second_method(self): 
        return None

Man verwendet Leerzeilen innerhalb von Funktionen sparsam, um klare Schritte zu zeigen. Manchmal muss eine komplizierte Funktion vor der Rückgabeanweisung mehrere Schritte ausführen. Um dem Leser zu helfen, die Logik innerhalb der Funktion zu verstehen, kann es hilfreich sein, eine Leerzeile zwischen den einzelnen Schritten zu lassen.

Im folgenden Beispiel geht es um eine Funktion zur Berechnung der Varianz einer Liste. Da es sich um ein zweistufiges Problem handelt, wird jeder Schritt durch eine Leerzeile gekennzeichnet. Es gibt auch eine Leerzeile vor der Return-Anweisung. So kann der Leser klar erkennen, was zurückgegeben wird:

def calculate_variance(number_list):
    sum_list = 0
    for number in number_list:
        sum_list = sum_list + number
    mean = sum_list / len(number_list)

    sum_squares = 0
    for number in number_list:
        sum_squares = sum_squares + number**2
    mean_squares = sum_squares / len(number_list)

    return mean_squares - mean**2

Wenn man den vertikalen Leerraum sorgfältig verwendet, kann er die Lesbarkeit des Codes erheblich verbessern. Er hilft dem Leser, visuell zu verstehen, wie der Code in Abschnitte aufgeteilt ist und wie diese Abschnitte miteinander in Beziehung stehen.

Maximale Zeilenlänge und Zeilenumbruch

PEP 8 schlägt vor, die Zeilenlänge auf 79 Zeichen zu begrenzen.

Natürlich ist es nicht immer möglich, Anweisungen auf 79 Zeichen oder weniger zu beschränken. PEP 8 beschreibt Möglichkeiten, um Anweisungen über mehrere Zeilen laufen zu lassen.

Python geht von einem Zeilenumbruch aus, wenn der Code innerhalb von Klammern oder geschweiften Klammern steht:

def function(arg_one, arg_two,
             arg_three, arg_four):

    return arg_one

Wenn es nicht möglich ist, eine implizite Fortsetzung zu verwenden, kann man stattdessen Backslashes zum Zeilenumbruch verwenden:

from mypkg import example1, \
   example2, example3

Wenn man jedoch eine implizite Fortsetzung verwenden kann, sollte man dies tun.

Wenn ein Zeilenumbruch um binäre Operatoren wie + und * erforderlich ist, sollte er vor dem Operator erfolgen. Diese Regel hat ihren Ursprung in der Mathematik. Mathematiker sind sich einig, dass ein Zeilenumbruch vor binären Operatoren die Lesbarkeit verbessert.

Zum Vergleich die beiden folgenden Beispiele.

Hier ein Beispiel für einen Umbruch vor einem binären Operator:

# empfohlen
total = (first_variable
         + second_variable
         - third_variable)

Man kann sofort erkennen, welche Variable addiert oder subtrahiert wird, da der Operator direkt neben der Variablen steht, mit der gearbeitet wird.

Hier nun ein Beispiel für einen Bruch nach einem binären Operator an:

# nicht empfohlen
total = (first_variable +
         second_variable -
         third_variable)

Hier ist es schwieriger zu erkennen, welche Variable addiert und welche subtrahiert wird.

Umbrüche vor binären Operatoren führen zu besser lesbarem Code, weshalb PEP 8 sie fördert. Code, der konsequent nach einem binären Operator bricht, ist zwar immer noch PEP 8-konform, aber man wird ermutigt, vor einem binären Operator die Zeile umzubrechen.