Qual è il modo migliore per generare un diagramma UML dal codice sorgente di Python? [chiuso]


258

Un collega sta cercando di generare diagrammi di classe UML da un sacco di codice sorgente Python. È principalmente interessato alle relazioni ereditarie e leggermente interessato alle relazioni compositive, e non gli importa molto degli attributi di classe che sono solo primitive di Python.

Il codice sorgente è piuttosto semplice e non tremendamente malvagio, ad esempio non fa alcuna fantasia di metaclasse. (È principalmente dai tempi di Python 1.5.2, con alcuni spolverati di roba "moderna" 2.3.)

Qual è la migliore soluzione esistente da raccomandare?


29
Le mod non hanno trovato questa domanda costruttiva. Io (e molti altri che hanno preferito questo) l'ho trovato utile. E allora? questo non è un affare più grande di questo non essere "costruttivo"!
Yati Sagade,

13
Non costruttivo perché solleciterà dibattiti, argomenti, discussioni ?????? Non è quello che vogliamo? Questa è una domanda molto rilevante.
Bhushan,

2
@yatisagade se noti che era chiuso, non cancellato (e con questo molti voti probabilmente non può praticamente mai essere cancellato). Chiudere significa solo che non è possibile ottenere nuove risposte.
Tacaswell,

7
@Bhushan No, non vogliamo discussioni, vogliamo coppie di domande e risposte che abbiano risposte chiare. Non è un giudizio sul fatto che sia una domanda interessante o una domanda utile, si tratta di essere in tema per SO. Sicuramente sei d'accordo sul fatto che "Qual è il miglior editore?" (obs emacs) non è una domanda costruttiva, questa domanda è esattamente dello stesso stampo.
Tacaswell,

@tacaswell Alcune discussioni sono molto rilevanti quando si tratta di affinare le domande in un formato di domande e risposte.
user32882

Risposte:


129

Potresti aver sentito parlare di Pylint che aiuta a controllare staticamente il codice Python. Poche persone sanno che viene fornito con uno strumento chiamato Pyreverse che disegna diagrammi UML dal codice Python che legge. Pyreverse usa graphviz come backend.

Si usa così:

pyreverse -o png -p yourpackage .

dove .può anche essere un singolo file.


sai come visualizzare i metodi privati ​​che iniziano con "_"
gustavz,

1
Sfortunatamente, i diagrammi dei pacchetti pyreverse sono enormi poiché tutto è posizionato in orizzontale (più di una limitazione di graphviz, ma comunque). Non utile per l'inclusione nei documenti.
Remo

@oarfish come soluzione alternativa, puoi selezionare i moduli che vuoi includere e creare diversi grafici separati.
jjmontes,

95

Epydoc è uno strumento per generare documentazione API dal codice sorgente di Python. Genera anche diagrammi di classe UML, usando Graphviz in modi fantasiosi. Ecco un esempio di diagramma generato dal codice sorgente di Epydoc stesso.

Poiché Epydoc esegue sia l'introspezione degli oggetti sia l'analisi della sorgente, può raccogliere maggiori informazioni rispetto agli analizzatori di codici statici come Doxygen: può ispezionare una discreta quantità di classi e funzioni generate dinamicamente, ma può anche utilizzare commenti o stringhe non assegnate come fonte di documentazione, ad es. per variabili e attributi pubblici di classe.


Esiste un modo per ottenere output grafica vettoriale invece di gif? Non ho trovato documentazione su questo e i grafici sono abbastanza inutili per qualsiasi cosa diversa da html doc.
Remo

3
Al momento epydocsembra impossibile generare grafici. Dai un'occhiata a questa segnalazione di bug .
Luís de Sousa,

14
non funziona con Python 3
tomsv

23

Controlla questo elenco di sette strumenti uml per Python


2
Il mio strumento UML open source Pynsource pynsource.com indicato nella pagina precedente ha subito molte modifiche alla versione da quando è stato menzionato. Ora analizza Python 3, ha zoom, layout, UML ASCII e supporto per il rendering PlantUML. Pynsource è anche, per quanto ne so, l'unico strumento UML che riconosce gli attributi dell'istanza Python (non solo gli attributi di classe). Ciò significa che espressioni come self.myattr si tradurranno in un attributo appropriato "myattr" nella classe UML risultante. I binari pronti per l'esecuzione sono disponibili per Mac, Windows, Ubuntu 18 e 16, nonché un repository Github open source.
abulka,

8

Alcune classi di programmi ben educati possono essere diagrammabili, ma in generale non è possibile farlo. Gli oggetti Python possono essere estesi in fase di esecuzione e oggetti di qualsiasi tipo possono essere assegnati a qualsiasi variabile di istanza. Capire a quali classi un oggetto può contenere puntatori (composizione) richiederebbe una piena comprensione del comportamento di runtime del programma.

Le capacità di metaclasse di Python significano che il ragionamento sulla struttura dell'ereditarietà richiederebbe anche una piena comprensione del comportamento di runtime del programma.

Per dimostrare che questi sono impossibili, sostenete che se esistesse un tale programmatore UML, allora potreste prendere un programma arbitrario, convertire istruzioni di "arresto" in istruzioni che avrebbero un impatto sul diagramma UML e usare il diagramma di UML per risolvere il problema di arresto, che come sappiamo è impossibile.


8
Alcune cose buone, ma la rinuncia alla mano che risolve l'arresto lo rovina. I casi patologici non sono la questione qui. È ben educato.
ddaa,

Cosa intendi con "rinuncia alla mano"? Non ho scritto le prove complete, ma ho dato abbastanza informazioni che chiunque abbia visto prove simili potrebbe crearle, una per composizione e una per eredità.
Andru Luvisi,

14
Ecco un'analogia: diff / patch può fallire in molti modi diversi, alcuni dei quali banali. È ancora molto utile in molti casi del mondo reale. In casi ragionevoli, il diagramma dell'eredità è banale. La delega è più complicata, ma fattibile per inferenza di tipo all'interno dei limiti di un pacchetto.
ddaa,

7

Se usi eclissi, forse PyUML . Non l'ho usato, però.


1
È davvero un buon suggerimento, ma FWIW noto sul sito del progetto PyUML che non supportano ancora Eclipse 3.4 (Ganimede). Non vedo l'ora di provarlo quando lo risolveranno.
Bill Karwin,

Ti è capitato di far funzionare PyUML con 3.4?
Anijhaw,

2
L'ultimo si impegna in questo progetto risale al 2009. Non compare nel Marketplace ed Eclipse non è in grado di installarlo .zipdall'archivio.
Luís de Sousa,


5

Anche Umbrello lo fa. nel menu vai su Codice -> importa progetto e quindi punta alla directory principale del tuo progetto. quindi inverte il codice per ya ...


conosci un modo per far sì che Umbrello generi il diagramma completo della classe (e le relazioni tra loro, non solo le classi da sole - non ricordare come si chiama quel diagramma)
vlad-ardelean

2
AAhh, è necessario importare i file e quindi quando si trascinano le classi nell'area di disegno, le connessioni vengono aggiunte automaticamente.
Hosane,

5

vipera è un piccolo progettista di applicazioni e uml è incluso. Puoi vederlo in:

vipera

I migliori saluti.


4

La SPE IDE è dotato di UML creatore. Basta aprire i file in SPE e fare clic sulla scheda UML.

Non so quanto sia comprensivo per le tue esigenze, ma non richiede alcun download o configurazione aggiuntivi da utilizzare.


purtroppo ha smesso di svilupparsi, ma funziona ancora qui! (2013)
Abdelouahab,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.