¿Cuál es la mejor manera de generar un diagrama UML a partir del código fuente de Python? [cerrado]

258

Un colega está buscando generar diagramas de clase UML a partir de montones de código fuente de Python. Está principalmente interesado en las relaciones de herencia, y ligeramente interesado en las relaciones de composición, y no le importan mucho los atributos de clase que son solo primitivas de Python.

El código fuente es bastante sencillo y no es tremendamente malvado, por ejemplo, no hace magia de metaclase elegante. (Es sobre todo de los días de Python 1.5.2, con algunas salpicaduras de material "moderno" 2.3ish).

¿Cuál es la mejor solución existente para recomendar?

Mike Pirnat
fuente
29
Mods no encontró esta pregunta constructiva. Yo (y muchos otros que lo hemos marcado como favorito) lo encontramos útil. ¿Y qué? ¡eso no es más importante que no ser "constructivo"!
yati sagade
13
No es constructivo porque solicitará debates, argumentos, discusiones ?????? ¿No es eso lo que queremos? Esta es una pregunta muy relevante ..
Bhushan
2
@yatisagade si observa que se cerró, no se eliminó (y con esta cantidad de votos positivos, prácticamente nunca se puede eliminar). Cerrar solo significa que no puede obtener nuevas respuestas.
tacaswell
77
@Bhushan No, no queremos discusión, queremos pares de preguntas y respuestas que tengan respuestas claras. No es un juicio sobre si es una pregunta interesante o útil, es una cuestión de tema para SO. Seguramente estás de acuerdo en que "¿Cuál es el mejor editor?" (obs emacs) no es una pregunta constructiva, esta pregunta es exactamente del mismo molde.
tacaswell
@tacaswell Alguna discusión es muy relevante cuando se trata de refinar preguntas en un formato de preguntas y respuestas.
user32882

Respuestas:

129

Es posible que haya oído hablar de Pylint que ayuda a verificar estáticamente el código de Python. Pocas personas saben que viene con una herramienta llamada Pyreverse que dibuja diagramas UML del código de Python que lee. Pyreverse usa graphviz como backend.

Se usa así:

pyreverse -o png -p yourpackage .

donde .también puede ser un solo archivo.

Nicolas Chauvat
fuente
sabes cómo visualizar métodos privados que comienzan con "_"
gustavz
1
Desafortunadamente, los diagramas de paquete pyreverse son enormes ya que todo se coloca horizontalmente (más de una limitación gráfica, pero aún así). No es útil para incluir en documentos.
pez remo
@oarfish como solución alternativa, puede elegir los módulos que desea incluir y crear varios gráficos separados.
jjmontes
95

Epydoc es una herramienta para generar documentación API a partir del código fuente de Python. También genera diagramas de clases UML, usando Graphviz de maneras elegantes. Aquí hay un ejemplo de diagrama generado a partir del código fuente del propio Epydoc.

Debido a que Epydoc realiza tanto la introspección de objetos como el análisis de fuentes, puede recopilar más información con respecto a analizadores de código estático como Doxygen: puede inspeccionar una buena cantidad de clases y funciones generadas dinámicamente, pero también puede usar comentarios o cadenas no asignadas como fuente de documentación, por ejemplo para variables y atributos públicos de clase.

piro
fuente
¿Hay alguna manera de que genere gráficos vectoriales en lugar de gifs? No encontré documentación sobre eso y los gráficos son bastante inútiles para otra cosa que no sea html doc.
pez remo
3
Actualmente, epydocparece incapaz de generar gráficos. Mira este informe de error .
Luís de Sousa
14
no funciona con python 3
tomsv
23

Consulte esta lista de siete herramientas uml para python

Jordi Cabot
fuente
2
Mi herramienta UML de código abierto Pynsource pynsource.com mencionada en la página anterior ha sufrido muchos cambios de versión desde que se mencionó. Ahora analiza Python 3, tiene zoom, diseño, ASCII UML y soporte de representación PlantUML. Pynsource también es, hasta donde yo sé, la única herramienta UML que reconoce los atributos de instancia de Python (no solo los atributos de clase). Esto significa que expresiones como self.myattr darán como resultado un atributo apropiado "myattr" en la clase UML resultante. Los binarios listos para ejecutar están disponibles para Mac, Windows, Ubuntu 18 y 16, así como un repositorio de código abierto de Github.
abulka
8

Ciertas clases de programas con buen comportamiento pueden ser diagramables, pero en el caso general, no se puede hacer. Los objetos de Python se pueden extender en tiempo de ejecución, y los objetos de cualquier tipo se pueden asignar a cualquier variable de instancia. Determinar qué clases puede contener un objeto para punteros (composición) requeriría una comprensión completa del comportamiento en tiempo de ejecución del programa.

Las capacidades de metaclase de Python significan que razonar sobre la estructura de herencia también requeriría una comprensión completa del comportamiento en tiempo de ejecución del programa.

Para demostrar que esto es imposible, usted argumenta que si existiera tal diagramador UML, entonces podría tomar un programa arbitrario, convertir las declaraciones de "alto" en declaraciones que impactarían el diagrama UML y usar el diagramador UML para resolver el problema de detención. que como sabemos es imposible.

Andru Luvisi
fuente
8
Algunas cosas buenas, pero la resolución de la suspensión de manos lo arruina. Los casos patológicos no son el problema aquí. El buen comportamiento es suficiente.
ddaa
¿Qué quieres decir con "renuncia de manos"? No escribí las pruebas completas, pero di suficiente información para que cualquiera que haya visto pruebas similares pudiera crearlas, una para la composición y otra para la herencia.
Andru Luvisi
14
Aquí hay una analogía: diff / patch puede fallar de muchas maneras diferentes, algunas de ellas triviales. Sigue siendo muy útil en muchos casos del mundo real. En casos razonables, la herencia de diagramas es trivial. La delegación es más complicada, pero factible por inferencia de tipos dentro de los límites de un paquete.
ddaa
7

Si usa eclipse, quizás PyUML . Sin embargo, no lo he usado.

David Arcos
fuente
1
Esa es una muy buena sugerencia, pero FWIW noto en el sitio del proyecto PyUML que todavía no son compatibles con Eclipse 3.4 (Ganímedes). Espero probarlo cuando lo resuelvan.
Bill Karwin el
¿Obtuviste que PyUML funcionara con 3.4?
anijhaw
2
La última confirmación de este proyecto se remonta a 2009. No aparece en Marketplace y Eclipse no puede instalarlo desde el .ziparchivo.
Luís de Sousa
7

Vale la pena mencionar a Gaphor . Una herramienta de modelado / UML de Python.

Ali Afshar
fuente
5

Umbrello también hace eso. en el menú, vaya a Código -> importar proyecto y luego apunte al directorio raíz de su proyecto. entonces invierte el código para ti ...

Hosane
fuente
Qué sabes de una manera de hacer Umbrello generar el Diagrama de clase completa (y las relaciones entre ellos, no sólo las clases por sí mismos - no me acuerdo cómo se llama ese diagrama)
Vlad-ardelean
2
AAhh, debe importar los archivos y luego, cuando arrastra y suelta clases en el área de dibujo, las conexiones se agregan automáticamente.
Hosane
5

vipera es un pequeño diseñador de aplicaciones y se incluye uml. Puedes verlo en:

vipera

Atentamente.

Ángel Luis
fuente
4

El SPE IDE ha incorporado en UML creador. Simplemente abra los archivos en SPE y haga clic en la pestaña UML.

No sé cuán grande es para sus necesidades, pero no requiere ninguna descarga o configuración adicional para usar.

cristal
fuente
lamentablemente ha dejado de desarrollarse, ¡pero aún funciona aquí! (2013)
Abdelouahab
4

Sparx's Enterprise Architect realiza un recorrido de ida y vuelta de la fuente de Python. Tienen una edición de prueba gratuita por tiempo limitado.

chimpance
fuente