Python-Linting – flake8 einrichten

Im Laufe einer Python-Karriere wird einem irgendwann das Thema Linting begegnen. Und in Verbindung mit diesem Begriff stößt man auf PyLint oder flake8. Dieser Blogbeitrag versucht zu erklären, was es damit auf sich hat.

Unter Linting versteht man das Durchführen einer Code-Analyse. Diese soll sicherstellen, dass der Code einheitlich formatiert und somit von gewisser Qualität ist. Wenn man alleine an einem Projekt arbeitet, mag dies nicht von großer Bedeutung sein, aber für die Arbeit in einem Team ist dies unerläßlich. Denn nur so wird sichergestellt, dass alle Teammitglieder einheitlichen Code erzeugen.

Folgendes Beispiel soll dies verdeutlichen:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def add_values(first_value,second_value):
    return first_value+second_value

def multiply_values(first_value, second_value):
 return first_value * second_value

result1 = add_values(2, 2)
result2 = multiply_values(2,2)
print(result1)
print(result2)

Der Code würde anstandslos ausgeführt werden. Und sowohl die Addition als auch die Multiplikation führen zum Ergebnis „4“.

Der Code ist aber nicht sehr „sauber“. Betrachtet man die Parameterliste von add_values und multiply_values, dann fällt auf, dass im zweiten Fall nach dem Komma ein Leerzeichen vorhanden ist, während es bei add_values(first_value,second_value) fehlt. Gleiches gilt auch für

result1 = add_values(2, 2)
result2 = multiply_values(2,2)

Bei first_value+second_value wurden die Operanden und der Operator + zusammen geschrieben, bei first_value * second_value sind hingegen Leerzeichen vorhanden. Außerdem sind die beiden Zeilen zwar eingerückt, aber zuerst mit vier Leerzeichen und dann mit einem Leerzeichen:

 return first_value+second_value
 return first_value * second_value

Bei wenigen Zeilen Code, so wie hier, mag man das noch als unerheblich empfinden, aber in einem größeren Projekt schränkt es die Lesbarkeit doch erheblich ein.

Nicht nur, aber insbesondere bei einem Projekt mit mehreren Entwicklern, bietet es sich daher an, einen Linter zu verwenden. Dabei handelt es sich um ein Software-Tool, dass die Qualität des Codes sicherstellt, indem überprüft wird, ob bestimmte Regeln eingehalten werden. Häufig wird dafür PyLint verwendet. In diesem Blogbeitrag möchte ich aber — das von mir bevorzugte — flake8 vorstellen. Dieses Tool muss zunächst mit

$ pip3 install flake8

installiert werden.

Im Code-Editor Eurer Wahl, ist es anschließend erforderlich, die flake8-Unterstützung zu aktivieren.

flake8 in SublimeText

In SublimeText installiert man dafür die Pakete

SublimeLinter

und

SublimeLinter-flake8

Unter

> Preferences > Package Settings > SublimeLinter > Settings

können dann die Linter definiert werden:

"linters": {
    "flake8": {
        "disable": false,
        "executable": "/Library/Frameworks/Python.framework/Versions/3.8/bin/flake8",
        "args": ["--ignore=E501,E127,E128,W191"],
    },
    "pylint": {
        "disable": true,
        "executable": "/Library/Frameworks/Python.framework/Versions/3.8/bin/pylint"
    }
}

Im obigen Beispiel könnt Ihr sehen, dass flake8 aktiviert und pylint deaktiviert wurde. Darüber hinaus ist jeweils der Pfad zum ausführbaren Programm angegeben. Bei flake8 habe ich zusätzlich die Zeile

"args": ["--ignore=E501,E127,E128,W191"]

hinzugefügt. Damit wird festgelegt, welche Regeln ignoriert werden sollen.

Bezogen auf den Code führt dies nun zu folgender Ansicht:

Links neben der Zeilennummerierung erscheinen jetzt Punkte, die darauf hinweisen, dass hier ein Problem vorliegt, mithin gegen eine Linter-Regel verstoßen wurde. Bewegt man den Mauszeiger über den in Rede stehenden Code, werden über ein Pup-Up-Fenster weitere Informationen angezeigt, inklusive der „Fehlernummer“. Dies ist die Nummer, die man in der SublimeLinter-Konfigurationsdatei unter „args“ eintrage kann, falls dieses Problem ignoriert werden soll.

Die Code-Analyse kann man auch in der Shell durchführen. Die Eingabe von

$ flake8 <Dateiname> 

führt in diesem Fall zu folgender Ausgabe:

linter_example.py:4:27: E231 missing whitespace after ','
linter_example.py:7:1: E302 expected 2 blank lines, found 1
linter_example.py:8:2: E111 indentation is not a multiple of four
linter_example.py:10:1: E305 expected 2 blank lines after class or function definition, found 1
linter_example.py:11:28: E231 missing whitespace after ','

flake8 in Visual Studio Code

In Visual Studio Code (VS Code) sollte man zunächst Microsofts Python Extension installieren. Wie Ihr dem Beschreibungstext zu dieser Extension entnehmen könnt, hat sie unter anderem die Linting-Unterstützung mit an Bord. Wie bereits oben erwähnt, dürft ihr freilich nicht vergessen den Linter Eurer Wahl zu installieren. im Fall von flake8 also

$ pip3 install flake8 // Linux und macOS
$ pip install flake8  // Windows 10

Die Konfigurationsdatei von Visual Studio Code ergänzt man anschließend noch um folgende Zeilen:

// Whether to lint Python files.
"python.linting.enabled": true,

// Enable/disable linting
"python.linting.pylintEnabled": false,
"python.linting.flake8Enabled": true,

// Path to flake8 executable
"python.linting.flake8Path": "/Library/Frameworks/Python.framework/Versions/3.8/bin/flake8",

// flake8 Arguments
"python.linting.flake8Args": ["--ignore=E501, E128", "--verbose", "--exclude=__init__.py"],

Hinsichtlich weiterer Optionen möchte ich auf die sehr gute Dokumentation zu Visual Studio Code verweisen. Dort findet Ihr auch eine Übersicht zu anderen Lintern, die zusammen mit Microsofts Editor verwendet werden können.

Wenn flake8 erstmal eingerichtet ist, werden im Code die Regelverletzungen unterstrichen. Auch hier öffnet sich ein Pop-Up-Fenster, wenn der Mauszeiger über den problematischen Code bewegt wird.

Außerdem werden im Terminal-Fenster im Bereich „Problems“ alle von flake8 beanstandeten Probleme aufgeführt. Ein Klick auf den entsprechenden Eintrag führt Euch dann sofort zum entsprechenden Code.

Weiterführende Links