Quelle est la meilleure façon de générer un diagramme UML à partir du code source Python? [fermé]


258

Un collègue cherche à générer des diagrammes de classes UML à partir de tas de code source Python. Il s'intéresse principalement aux relations d'héritage, et s'intéresse légèrement aux relations de composition, et ne se soucie pas beaucoup des attributs de classe qui ne sont que des primitives Python.

Le code source est assez simple et pas terriblement mauvais - il ne fait pas de magie de métaclasse fantaisie, par exemple. (C'est principalement à l'époque de Python 1.5.2, avec quelques arrosages de trucs 2.3ish "modernes".)

Quelle est la meilleure solution existante à recommander?


29
Les mods n'ont pas trouvé cette question constructive. J'ai (et beaucoup d'autres qui l'ont favorisé) trouvé cela utile. Et alors? ce n'est pas plus grave que cela de ne pas être "constructif"!
yati sagade

13
Pas constructif car il sollicitera des débats, des arguments, des discussions ?????? N'est-ce pas ce que nous voulons? Ceci est une question très pertinente ..
Bhushan

2
@yatisagade si vous constatez qu'il a été fermé et non supprimé (et avec cela, de nombreux votes positifs ne peuvent probablement jamais être supprimés). La fermeture signifie simplement qu'il ne peut pas obtenir de nouvelles réponses.
tacaswell

7
@Bhushan Non, nous ne voulons pas de discussion, nous voulons des paires de questions et réponses qui ont des réponses claires. Ce n'est pas un jugement sur le fait que ce soit une question intéressante ou une question utile, c'est une question de sujet pour SO. Vous convenez sûrement que "Quel est le meilleur éditeur?" (obs emacs) n'est pas une question constructive, cette question est exactement du même moule.
tacaswell

@tacaswell Certaines discussions sont très pertinentes lorsqu'il s'agit d'affiner les questions dans un format de questions / réponses.
user32882

Réponses:


129

Vous avez peut-être entendu parler de Pylint qui aide à vérifier statiquement le code Python. Peu de gens savent qu'il est livré avec un outil nommé Pyreverse qui dessine des diagrammes UML à partir du code python qu'il lit. Pyreverse utilise graphviz comme backend.

Il est utilisé comme ceci:

pyreverse -o png -p yourpackage .

où le .peut également être un seul fichier.


savez-vous comment visualiser les méthodes privées commençant par "_"
gustavz

1
Malheureusement, les diagrammes de paquet pyreverse sont énormes car tout est placé horizontalement (plus d'une limitation graphviz, mais quand même). Inutile pour l'inclure dans les documents.
Oarfish

@oarfish comme solution de contournement, vous pouvez sélectionner les modules que vous souhaitez inclure et créer plusieurs graphiques distincts.
jjmontes

95

Epydoc est un outil pour générer de la documentation API à partir du code source Python. Il génère également des diagrammes de classes UML, en utilisant Graphviz de manière sophistiquée. Voici un exemple de diagramme généré à partir du code source d'Epydoc lui-même.

Parce qu'Epydoc effectue à la fois une introspection d'objets et une analyse de source, il peut recueillir plus d'informations sur les analyseurs de code statiques tels que Doxygen: il peut inspecter une bonne quantité de classes et de fonctions générées dynamiquement, mais peut également utiliser des commentaires ou des chaînes non attribuées comme source de documentation, par exemple pour les variables et les attributs publics de classe.


Existe-t-il un moyen de le faire sortir des graphiques vectoriels au lieu de gifs? Je n'ai trouvé aucune documentation à ce sujet et les graphiques sont assez inutiles pour autre chose que le doc html.
oarfish

3
Actuellement, epydocsemble incapable de générer des graphiques. Consultez ce rapport de bogue .
Luís de Sousa

14
ne fonctionne pas avec python 3
tomsv

23

Consultez cette liste de sept outils uml pour python


2
Mon outil UML open source Pynsource pynsource.com mentionné sur la page ci-dessus a subi de nombreux changements de version depuis qu'il a été mentionné. Il analyse maintenant Python 3, prend en charge le zoom, la mise en page, le rendu ASCII UML et PlantUML. Pynsource est également, à ma connaissance, le seul outil UML qui reconnaît les attributs d'instance Python (pas seulement les attributs de classe). Cela signifie que des expressions comme self.myattr se traduiront par un attribut approprié "myattr" dans la classe UML résultante. Des binaires prêts à fonctionner sont disponibles pour Mac, Windows, Ubuntu 18 et 16 - ainsi qu'un dépôt Github open source.
abulka

8

Certaines classes de programmes bien comportés peuvent être schématisées, mais dans le cas général, cela ne peut pas être fait. Les objets Python peuvent être étendus au moment de l'exécution et des objets de tout type peuvent être affectés à n'importe quelle variable d'instance. Déterminer à quelles classes un objet peut contenir des pointeurs vers (composition) nécessiterait une compréhension complète du comportement d'exécution du programme.

Les capacités de métaclasse de Python signifient que le raisonnement sur la structure d'héritage nécessiterait également une compréhension complète du comportement d'exécution du programme.

Pour prouver que cela est impossible, vous soutenez que si un tel diagramme UML existait, alors vous pourriez prendre un programme arbitraire, convertir des instructions "halt" en instructions qui auraient un impact sur le diagramme UML et utiliser le diagramme UML pour résoudre le problème d'arrêt, qui, comme nous le savons, est impossible.


8
De bonnes choses, mais la renonciation à la main qui résout les arrêts la ruine. Les cas pathologiques ne sont pas en cause ici. Un bon comportement suffit.
ddaa

Que voulez-vous dire par "renonciation à la main"? Je n'ai pas rédigé les épreuves complètes, mais j'ai donné suffisamment d'informations pour que quiconque ayant vu des épreuves similaires puisse les créer, une pour la composition et une pour l'héritage.
Andru Luvisi

14
Voici une analogie: diff / patch peut échouer de différentes manières, certaines triviales. Il est toujours très utile dans de nombreux cas du monde réel. Dans des cas raisonnables, l'héritage de diagrammes est trivial. La délégation est plus délicate, mais réalisable par inférence de type dans les limites d'un package.
ddaa

7

Si vous utilisez Eclipse, peut-être PyUML . Je ne l'ai pas utilisé, cependant.


1
C'est une très bonne suggestion, mais FWIW, je remarque sur le site du projet PyUML qu'ils ne prennent pas encore en charge Eclipse 3.4 (Ganymède). J'attends avec impatience de l'essayer quand ils trouveront ça.
Bill Karwin

Vous est-il arrivé de faire fonctionner PyUML avec la 3.4?
anijhaw

2
Le dernier engagement sur ce projet remonte à 2009. Il n'apparaît pas sur la Marketplace et Eclipse n'est pas en mesure de l'installer à partir de l' .ziparchive.
Luís de Sousa


5

Umbrello fait ça aussi. dans le menu, accédez à Code -> importer le projet, puis pointez sur le répertoire racine de votre projet. puis il inverse le code pour toi ...


connaissez-vous un moyen de faire en sorte qu'Umbrello génère le diagramme de classes complet (et les relations entre eux, pas seulement les classes par elles-mêmes - ne me souviens pas comment ce diagramme est appelé)
vlad-ardelean

2
AAhh, vous devez importer les fichiers, puis lorsque vous faites glisser et déposez des classes dans la zone de dessin, les connexions sont automatiquement ajoutées.
Hosane

5

vipera est un petit concepteur d'applications, et uml est inclus. Vous pouvez le voir dans:

vipera

Meilleures salutations.


4

L' IDE SPE a un créateur UML intégré. Ouvrez simplement les fichiers dans SPE et cliquez sur l'onglet UML.

Je ne sais pas à quel point cela correspond à vos besoins, mais cela ne nécessite aucun téléchargement ou configuration supplémentaire à utiliser.


malheureusement, il a cessé de se développer, mais fonctionne toujours ici! (2013)
Abdelouahab

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.