Formatierung von Python-Code mit Black

Als Einsteiger in die Programmierung wird man sich kaum mit der Formatierung von Code befassen. So war es zumindest bei mir. Und bei kleinen Python-Skripten, mit relativ wenig Codezeilen, mag dies auch nicht zwingend erforderlich sein. Anders sieht es hingegen aus, wenn ein Projekt wächst, wenn aus 100 Zeilen 1000 Zeilen oder mehr werden. Oder wenn an einem Projekt mehrere Entwickler arbeiten.

Der Vorteil einer Formatierung liegt auf der Hand: Es entsteht einheitlicher — besser lesbarer — Code.

Am verbreitesten dürfte wohl der Formatierer Black sein, den ich in diesem Beitrag vorstellen möchte. Die Installation von Black erfolgt mit pip:

$ pip install black  # -> Windows
$ pip3 install black # -> Linux, macOS

In der Shell kann jetzt der Befehl black aufgerufen werden. Eine einzelne Python-Datei wird mit

$ black <Dateiname>

formatiert. Nachfolgend möchte ich dies anhand folgenden Python-Codes demonstrieren. Es handelt sich dabei um ein Programm, mit dem arabische Ziffern in römische Ziffern konvertiert werden können:

val = [1000,900,500,400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
rom = ['M', "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"]


def arabic_to_roman(arabic_number: int) -> str:
    ans = ""
    for i in range( 13 ):
        while arabic_number >= val[i]:
            print( i )
            print(arabic_number, val[i])
            ans += rom[i]
            arabic_number-=val[i]
    return ans


print(arabic_to_roman( 18 ))

Wenn Ihr diesen Code in einem Code-Editor wie Sublime Text oder Visual Studio Code speichert und beispielsweise flake8 als Linter nutzt, werden Euch die in diesem Code vorhandenen „Fehler“ angezeigt:

flake8 weist auf Formatierungsfehler hin

Anhand der zahlreichen gekringelten Linien und der gelben Punkte auf der linken Seite könnt Ihr erkennen, dass flake8 einiges zu bemängeln hat. Nun könnte jeder dieser Formatierungsfehler der Reihe nach behoben werden, was bereits bei diesen wenigen Zeilen Code vergleichsweise aufwendig wäre. Hier kommt jetzt Black zum Zug. Denn während ein Linter — wie flake8 — lediglich auf Formatierungsfehler hinweist, können sie mit Black beseitigt werden.

Wie oben bereits dargestellt, muss dazu lediglich black, gefolgt vom Dateinamen, aufgerufen werden:

$ black roman_numbers.py
reformatted roman_numbers.py
All done! ✨ 🍰 ✨
1 file reformatted.

Betrachten wir jetzt zum Beispiel nur die beiden Listen zu Beginn des Python-Skripts, dann fällt auf, dass nach den Kommata jeweils ein Leerzeichen eingefügt wurde.

val = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
rom = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"]

Hinsicht der Formatierung orientiert sich Black an dem im PEP8 (Python Enhancement Proposal 8) definierten Style Guide, der 2001 von Guido van Rossum niedergeschrieben wurde. Mehr Informationen zu dem dort vorgeschlagenen Codestil findet Ihr auf der PEP8-Internetseite.

Neben dem Einfügen von Leerzeichen, wurden einfache Anführungszeichen durch doppelte Anführungszeichen ersetzt, z.B. bei "M" in der Liste rom. Der Linter hat dies nicht bemängelt, aber Black bevorzugt nunmal doppelte Anführungszeichen, wie unter anderem im Black Code Style nachgelesen werden kann.

Sollen mehrere Dateien formatiert werden, dann ist folgende Syntax zu verwenden:

$ black <Verzeichnisname>

Alle Dateien im angegebenen Verzeichnis werden dadurch neu formatiert.

Mit der Anweisung

$ black --check .

werden jene Dateien angezeigt, die Black formatieren würde. Änderungen an den Dateien werden aber nicht vorgenommen.

Und die Anweisung

$ black --check --diff <Dateiname>

zeigt die vorzunehmenden Formatierungen an. Auch hier werden aber keine Änderungen vorgenommen.

Standardmäßig werden von black einfache Anführungszeichen durch doppelte Anführungszeichen ersetzt. Falls black Anführungszeichen nicht verändern soll, könnt Ihr dies mit black -s erreichen. Alternativ kann auch das Programm blue für die Formatierung verwendet werden, das standardmäßig einfache Anführungszeichen setzt. Ansonsten ist es black sehr ähnlich.

Formatierung in PyCharm aktivieren

In JetBrains Entwicklungsumgebung PyCharm kann Black in den Einstellungen aktiviert werden. Voraussetzung ist selbstverständlich, dass Black bereits installiert wurde. Öffnet die Einstellungen und ruft dort unter „Tools“ die Optionen zu „Black“ auf. Ihr könnt dort festlegen, dass Black verwendet werden soll, sobald der Code formatiert wird (option + command + L auf dem Mac) und/oder die Python-Datei gespeichert wird.

Black in PyCharm aktivieren

Zuletzt aktualisiert am 9. Dezember 2023