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?


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.


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.


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


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.


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.


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


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 ...


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.


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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.