343 votes

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

Un collègue cherche à générer des diagrammes de classe UML à partir de tas de code source Python. Il est principalement intéressé par les relations d'héritage, et légèrement intéressé par les 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 n'est pas terriblement mauvais - il ne fait pas de magie de métaclasses fantaisistes, par exemple. (Il date principalement de l'époque de Python 1.5.2, avec quelques saupoudrages de trucs "modernes" 2.3ish).

Quelle est la meilleure solution existante à recommander ?

57 votes

Les mods n'ont pas trouvé cette question constructive. Moi (et beaucoup d'autres qui l'ont favorisée), je l'ai trouvée utile. Et alors ? que n'est pas plus important que le fait que ce ne soit pas "constructif" !

21 votes

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

3 votes

@yatisagade si vous notez qu'elle a été fermée, pas supprimée (et avec autant de votes positifs, elle ne peut pratiquement jamais être supprimée). La fermeture signifie simplement qu'elle ne peut pas recevoir de nouvelles réponses.

186voto

Nicolas Chauvat Points 191

Vous avez peut-être entendu parler de Pylint qui aide à la vérification statique du 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 suit :

pyreverse -o png -p yourpackage .

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

0 votes

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

3 votes

Malheureusement, les diagrammes de paquets pyreverse sont énormes puisque tout est placé horizontalement (c'est plus une limitation de graphviz, mais quand même). Pas utile pour les inclure dans des documents.

1 votes

@oarfish comme solution de rechange, vous pouvez choisir les modules que vous voulez inclure et créer plusieurs graphiques séparés.

100voto

piro Points 4848

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

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

0 votes

Y a-t-il un moyen de lui faire produire des graphiques vectoriels au lieu de gifs ? Je n'ai trouvé aucune documentation à ce sujet et les graphiques sont assez inutiles pour tout ce qui n'est pas un document html.

3 votes

Actuellement, epydoc semble incapable de générer des graphiques. Regardez ceci rapport de bogue .

23 votes

Ne fonctionne pas avec python 3

26voto

Jordi Cabot Points 4764

Consultez cette liste de sept outils uml pour python

4 votes

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, supporte le zoom, la mise en page, le rendu ASCII UML et PlantUML. Pynsource est aussi, pour autant que je sache, 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 donneront lieu à un attribut "myattr" dans la classe UML résultante. Des binaires prêts à l'emploi sont disponibles pour Mac, Windows, Ubuntu 18 et 16 - ainsi qu'un repo Github open source.

15voto

Glomek Points 12183

Certaines classes de programmes bien conçus peuvent être schématisées, mais dans le cas général, c'est impossible. Les objets Python peuvent être étendus au moment de l'exécution, et des objets de n'importe quel type peuvent être affectés à n'importe quelle variable d'instance. Pour déterminer les classes vers lesquelles un objet peut contenir des pointeurs (composition), il faudrait comprendre parfaitement le comportement d'exécution du programme.

Les capacités des métaclasses 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 affirmez que si un tel diagrammeur UML existait, alors vous pourriez prendre un programme arbitraire, convertir les instructions "halte" en instructions qui auraient un impact sur le diagramme UML, et utiliser le diagrammeur UML pour résoudre le problème de l'arrêt, ce qui, comme nous le savons, est impossible.

9 votes

Il y a de bonnes choses, mais le fait de devoir résoudre des arrêts de travail gâche tout. Les cas pathologiques ne sont pas en cause ici. Une bonne conduite est suffisante.

1 votes

Que voulez-vous dire par "hand-waiving" ? Je n'ai pas écrit les preuves complètes, mais j'ai donné suffisamment d'informations pour que toute personne ayant vu des preuves similaires puisse les créer, une pour la composition et une pour l'héritage.

19 votes

Voici une analogie : diff/patch peut échouer de nombreuses façons différentes, dont certaines sont triviales. Il reste néanmoins très utile dans de nombreux cas réels. Dans des cas raisonnables, le diagramme de l'héritage est trivial. La délégation est plus délicate, mais faisable par inférence de type dans les limites d'un paquet.

6voto

David Arcos Points 2059

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

1 votes

C'est une très bonne suggestion, mais j'ai remarqué sur le site du projet PyUML qu'ils ne supportent pas encore Eclipse 3.4 (Ganymede). J'ai hâte de l'essayer quand ils auront résolu ce problème.

0 votes

Avez-vous réussi à faire fonctionner PyUML avec la version 3.4 ?

3 votes

Les derniers engagements pour ce projet remontent à 2009. Il n'apparaît pas dans le Marketplace et Eclipse n'est pas en mesure de l'installer à partir de la page d'accueil. .zip archives.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X