Was ist der beste Weg, um ein UML-Diagramm aus Python-Quellcode zu generieren? [geschlossen]

258

Ein Kollege möchte UML-Klassendiagramme aus Haufen von Python-Quellcode generieren. Er interessiert sich hauptsächlich für die Vererbungsbeziehungen und leicht für kompositorische Beziehungen und kümmert sich nicht viel um Klassenattribute, die nur Python-Primitive sind.

Der Quellcode ist ziemlich einfach und nicht besonders böse - er macht zum Beispiel keine ausgefallene Metaklassen-Magie. (Es ist größtenteils aus den Tagen von Python 1.5.2, mit einigen Spritzer "modernen" 2.3ish-Materials.)

Was ist die beste zu empfehlende Lösung?

Mike Pirnat
quelle
29
Mods fanden diese Frage nicht konstruktiv. Ich (und viele andere, die dies favorisiert haben) fanden es nützlich. Na und? das ist keine größere Sache als dies nicht "konstruktiv" zu sein!
Yati Sagade
13
Nicht konstruktiv, weil es Debatten, Argumente, Diskussionen anregen wird ?????? Wollen wir das nicht? Dies ist eine sehr relevante Frage ..
Bhushan
2
@yatisagade, wenn Sie feststellen, dass es geschlossen, nicht gelöscht wurde (und mit diesem viele Upvotes können wahrscheinlich praktisch nie gelöscht werden). Schließen bedeutet nur, dass es keine neuen Antworten bekommen kann.
Tacaswell
7
@ Bhushan Nein, wir wollen keine Diskussion, wir wollen Frage-Antwort-Paare, die klare Antworten haben. Es ist kein Urteil darüber, dass es sich um eine interessante oder nützliche Frage handelt, es geht darum, für SO thematisch zu sein. Sicher stimmen Sie zu, dass "Was ist der beste Editor?" (obs emacs) ist keine konstruktive Frage, diese Frage hat genau die gleiche Form.
Tacaswell
@tacaswell Einige Diskussionen sind sehr relevant, wenn es darum geht, Fragen in ein Q & A-Format zu verfeinern.
user32882

Antworten:

128

Möglicherweise haben Sie von Pylint gehört , mit dessen Hilfe Python-Code statisch überprüft werden kann. Nur wenige Leute wissen, dass es ein Tool namens Pyreverse enthält , das UML-Diagramme aus dem gelesenen Python-Code zeichnet. Pyreverse verwendet Graphviz als Backend.

Nicolas Chauvat
quelle
Wissen Sie, wie man private Methoden visualisiert, beginnend mit "_"
gustavz
1
Leider sind Pyreverse-Paketdiagramme riesig, da alles horizontal angeordnet ist (eher eine grafische Einschränkung, aber immer noch). Nicht nützlich für die Aufnahme in Dokumente.
Oarfish
Als Problemumgehung können Sie bei @oarfish die Module auswählen, die Sie einschließen möchten, und mehrere separate Diagramme erstellen.
Jjmontes
95

Epydoc ist ein Tool zum Generieren von API-Dokumentation aus Python-Quellcode. Es generiert auch UML-Klassendiagramme, wobei Graphviz auf ausgefallene Weise verwendet wird. Hier ist ein Beispiel eines Diagramms, das aus dem Quellcode von Epydoc selbst generiert wurde.

Da Epydoc sowohl Objekt-Introspektion als auch Quell-Parsing durchführt, kann es mehr Informationen zu statischen Code-Analysatoren wie Doxygen sammeln: Es kann eine ganze Reihe dynamisch generierter Klassen und Funktionen untersuchen, aber auch Kommentare oder nicht zugewiesene Zeichenfolgen als Dokumentationsquelle verwenden, z für Variablen und öffentliche Klassenattribute.

Piro
quelle
Gibt es eine Möglichkeit, Vektorgrafiken anstelle von Gifs auszugeben? Ich habe keine Dokumentation dazu gefunden und die Grafiken sind für alles andere als HTML-Dokument ziemlich nutzlos.
Oarfish
3
Derzeit epydocscheint es nicht möglich zu sein, Diagramme zu generieren. Schauen Sie sich diesen Fehlerbericht an .
Luís de Sousa
14
funktioniert nicht mit Python 3
Tomsv
23

Überprüfen Sie diese Liste von sieben uml-Tools für Python

Jordi Cabot
quelle
2
Mein Open-Source-UML-Tool Pynsource pynsource.com , auf das auf der obigen Seite verwiesen wird, hat seit seiner Erwähnung viele Versionsänderungen erfahren. Es analysiert jetzt Python 3, unterstützt Zoom, Layout, ASCII-UML und PlantUML-Rendering. Pynsource ist meines Wissens auch das einzige UML-Tool, das Python-Instanzattribute (nicht nur Klassenattribute) erkennt. Dies bedeutet, dass Ausdrücke wie self.myattr zu einem richtigen Attribut "myattr" in der resultierenden UML-Klasse führen. Ready-to-Run-Binärdateien sind für Mac, Windows, Ubuntu 18 und 16 sowie ein Open-Source-Github-Repo verfügbar.
Abulka
8

Bestimmte Klassen von gut erzogenen Programmen können grafisch dargestellt werden, im allgemeinen Fall ist dies jedoch nicht möglich. Python-Objekte können zur Laufzeit erweitert werden, und Objekte eines beliebigen Typs können einer beliebigen Instanzvariablen zugewiesen werden. Um herauszufinden, auf welche Klassen ein Objekt Zeiger auf (Komposition) enthalten kann, muss das Laufzeitverhalten des Programms vollständig verstanden werden.

Aufgrund der Metaklassenfunktionen von Python erfordert das Nachdenken über die Vererbungsstruktur auch ein umfassendes Verständnis des Laufzeitverhaltens des Programms.

Um zu beweisen, dass dies unmöglich ist, argumentieren Sie, dass Sie, wenn ein solcher UML-Diagrammer existiert, ein beliebiges Programm verwenden, "halt" -Anweisungen in Anweisungen konvertieren könnten, die sich auf das UML-Diagramm auswirken würden, und den UML-Diagrammer verwenden könnten, um das Stoppproblem zu lösen. was bekanntlich unmöglich ist.

Andru Luvisi
quelle
8
Einige gute Dinge, aber das Anhalten des Handlösens ruiniert es. Pathologische Fälle sind hier nicht die Sache. Gut erzogen ist genug.
ddaa
Was meinst du mit "Handverzicht"? Ich habe nicht die vollständigen Beweise ausgeschrieben, aber ich habe genug Informationen gegeben, damit jeder, der ähnliche Beweise gesehen hat, sie erstellen kann, einen für die Komposition und einen für die Vererbung.
Andru Luvisi
14
Hier ist eine Analogie: Diff / Patch kann auf viele verschiedene Arten fehlschlagen, von denen einige trivial sind. Es ist immer noch sehr nützlich in vielen Fällen der realen Welt. In vernünftigen Fällen ist die grafische Darstellung der Vererbung trivial. Die Delegierung ist schwieriger, aber durch Typinferenz innerhalb der Grenzen eines Pakets möglich.
ddaa
7

Wenn Sie Eclipse verwenden, möglicherweise PyUML . Ich habe es aber nicht benutzt.

David Arcos
quelle
1
Das ist ein wirklich guter Vorschlag, aber FWIW Ich stelle auf der PyUML-Projektseite fest, dass Eclipse 3.4 (Ganymede) noch nicht unterstützt wird. Ich freue mich darauf, es zu versuchen, wenn sie das klären.
Bill Karwin
Haben Sie PyUML mit 3.4 zum Laufen gebracht?
Anijhaw
2
Die letzten Zusagen für dieses Projekt stammen aus dem Jahr 2009. Es wird nicht auf dem Marktplatz angezeigt und Eclipse kann es nicht aus dem .zipArchiv installieren .
Luís de Sousa
7

Es ist erwähnenswert, Gaphor . Ein Python-Modellierungs- / UML-Tool.

Ali Afshar
quelle
5

Umbrello macht das auch. Gehen Sie im Menü zu Code -> Projekt importieren und zeigen Sie dann auf das Stammverzeichnis Ihres Projekts. dann kehrt es den Code für dich um ...

Hosane
quelle
Kennen Sie eine Möglichkeit, Umbrello dazu zu bringen, das vollständige Klassendiagramm zu erstellen (und die Beziehungen zwischen ihnen, nicht nur die Klassen selbst - erinnern Sie sich nicht, wie dieses Diagramm heißt)
vlad-ardelean
2
AAhh, Sie müssen die Dateien importieren und wenn Sie Klassen in den Zeichenbereich ziehen und dort ablegen, werden die Verbindungen automatisch hinzugefügt.
Hosane
5

vipera ist ein kleiner Anwendungsdesigner, und uml ist enthalten. Sie können es sehen in:

Vipera

Freundliche Grüße.

Ángel Luis
quelle
4

Die SPE- IDE verfügt über einen integrierten UML-Ersteller. Öffnen Sie einfach die Dateien in SPE und klicken Sie auf die Registerkarte UML.

Ich weiß nicht, wie umfassend es für Ihre Anforderungen ist, aber es erfordert keine zusätzlichen Downloads oder Konfigurationen, um es zu verwenden.

Kristallgitter
quelle
Leider hat es aufgehört sich zu entwickeln, funktioniert aber immer noch hier! (2013)
Abdelouahab
4

Sparx ' Enterprise Architect führt eine Rundauslösung der Python-Quelle durch. Sie haben eine kostenlose zeitlich begrenzte Testversion.

Schimpanse
quelle