Um sich einen groben Überblick über einen objektorientierten Quellcode zu verschaffen haben sich die Softwarearchitekten dieser Welt eine besondere Schreibweise ausgedacht: Klassendiagramme.

Diese Diagramme sind sozusagen eine Möglichkeit, mit der du deinen Code grafisch darstellen kannst. Genauer gesagt kannst du anhand von Klassendiagrammen die Beziehungen zwischen Klassen, Schnittstellen und deren Attribute modellieren.

Auch Python ist auf objektorientierten Prinzipien aufgebaut. Deswegen kannst du deinen Python Code ebenfalls in Klassendiagramme verwandeln. Ein Tool, das dies bewerkstelligen kann, nennt sich Pyreverse. Der Name setzt sich aus Py für Python und reverse für reverse-engineering zusammen.

Wenn du keine eigene Software installieren möchtest, kannst du auch meinen online UML Klassendiagramm Generator für Python benutzen.

In diesem Artikel lernst du, wie du Pyreverse installierst und einsetzt um Klassendiagramme aus deinem Python Code zu generieren.

Schritt #1 installiere Pyreverse

Pyreverse ist Teil des Pylint Pakets. Da du sowieso ein linting Tool verwenden solltest schadet es nichts Pylint zu installieren.

pip install -U pylint

Wenn die Installation geklappt hat, solltest du folgende Befehle ohne Fehlermeldung ausführen können.

pylint --help
pyreverse --help

Schritt #2 installiere Graphviz

Pyreverse kann von Haus aus nur .dot Dateien erzeugen. Um etablierte Grafikformate wie .png, .jpg oder .svg zu erzeugen benötigt Pyreverse ein externes Tool: Graphviz.

Graphviz mit Windows manuell installieren

Für Windows kannst du Graphviz der offiziellen Webseite herunterladen. Oder direkt über diesen Link. Im heruntergeladenen Zip Archiv befindet sich ein Ordner “Graphviz” und darin ein Ordner “bin”. Den Inhalt des bin Ordners kopierst du nach C:\Program Files (x86)\Graphviz\bin und fügst diesen in deine PATH Variable hinzu.

Grapviz mit einem Paketmanager installieren

Alternativ dazu kannst du Graphviz auch mit dem Paketmanager deines Vertrauens installieren.

Für Chocolatey, Winget, MacPorts, Homebrew, Ubuntu, Debian, Redhat, CentOS und Fedora gibt es ein Paket das in jedem dieser Paketmanager den Namen “graphviz trägt”.

Installation testen

Wenn die Installation geklappt kannst du folgenden Befehl ausführen.

dot -V

Schritt #3 erzeuge Klassendiagramme

Nachdem du alle Vorkehrungen getroffen hast, kannst du endlich mit dem Generieren der Grafiken anfangen.

Pyreverse kann sowohl installierte Module, als auch einfache Pfade mit Pythondateien analysieren.

Module analysieren

Hier mal ein Beispiel mit dem datetime Modul:

pyreverse -o png datetime
parsing c:\users\quisl\appdata\local\programs\python\python38-32\lib\datetime.py...

Jetzt erstellt pyreverse eine Datei im aktuellen Arbeitsverzeichnis mit dem Namen “classes.png”.

Datetime in Pyreverse

Wenn es sich um ein modulares Paket handelt, erzeugt Pyreverse auch eine packages.png. Darin werden Beziehung der einzelnen Pakete untereinander dargestellt. (Das ist zum Beispiel in der requests Bibliothek der Fall.)

Einzelne Dateien analysieren

Alternativ zu den installierten Modulen können auch einzelne Dateien oder Pfade analysiert werden:

pyreverse -o png test.py

Sonstiges

Zum Schluss nochmal alle Optionen von Pyreverse:

Benutzung:
  pyreverse [optionen] <pakete>

  Erstellt UML Diagramme für Klassen und Module in <pakete>

Optionen:
  -h, --help            zeigt diese Hilfe und beendet pyreverse
  -f <mode>, --filter-mode=<mode>
                        filtert Attribute und Funktionen je nach <mode>. Mögliche modes sind :
                        'PUB_ONLY' Filtert alle nicht public Attribute [DEFAULT], äquivalent zu PRIVATE+SPECIAL_A
                        'ALL' kein Filter
                        'SPECIAL' filtert spezielle Python Funktionen (ausgenommen sind Konstruktoren)
                        'OTHER' filtert geschützte und private
                        Attribute
  -c <class>, --class=<class>
                        erstellt ein Klassendiagramm mit allen verwandten Klassen
                        <class>; benutzt im default die Optionen -ASmy
  -a <ancestor>, --show-ancestors=<ancestor>
                        zeigt <ancestor> Generationen von vorfahren der gefundenen Klassen. Die nicht im Projekt sind.
  -A, --all-ancestors   zeigt alle vorfahren von allen Klassen im Projekt
  -s <association_level>, --show-associated=<association_level>
                        zeigt <association_level> Level von zugehörigen Klassen die nicht im Projekt sind
  -S, --all-associated  zeigt alle zugehörigen Klassen rekursiv an die nicht im Projekt sind
  -b, --show-builtin    zeigt auch builtin Objects im Klassendiagramm an
  -m [yn], --module-names=[yn]
                        fügt einen Modulnamen im Klassendiagramm hinzu
  -k, --only-classnames
                        zeige keine Attribute und Methoden in der Klassenbox an;
                        dies deaktiviert die -f Werte
  -o <format>, --output=<format>
                        erstellt eine *.<format> Ausgabedatei wenn das jeweilige Format existiert.
  --ignore=<file[,file...]>
                        Fügt dateien einer Blacklist hinzu. Sie sollten die Basenamen sein und keine einzelnen Dateipfade.
  -p <project name>, --project=<project name>
                        setzt den namen des Projekts.


Konnte ich helfen? Ich freue mich über einen Drink! 💙