Jaki jest najlepszy sposób na wygenerowanie diagramu UML z kodu źródłowego Pythona? [Zamknięte]


258

Kolega chce wygenerować diagramy klas UML ze stosów kodu źródłowego Pythona. Interesuje się przede wszystkim relacjami dziedziczenia, a łagodnie interesuje się relacjami kompozycyjnymi i nie dba o atrybuty klas, które są po prostu prymitywami Pythona.

Kod źródłowy jest dość prosty i nie jest niesamowicie zły - na przykład nie robi żadnej magicznej metaklasy. (To głównie z czasów Pythona 1.5.2, z kilkoma „nowoczesnymi” 2.3ishowymi rzeczami.)

Jakie najlepsze istniejące rozwiązanie polecić?


29
Mody nie uznały tego pytania za konstruktywne. Ja (i wielu innych, którzy to faworyzowali) uznałem za użyteczne. Więc co? że nie jest większa niż ta umowa nie jest „konstruktywne”!
yati sagade

13
Nie jest konstruktywna, ponieważ będzie zachęcać do debat, argumentów, dyskusji ?????? Czy nie tego chcemy? To jest bardzo istotne pytanie ..
Bhushan

2
@yatisagade, jeśli zauważysz, że został zamknięty, a nie usunięty (a przy tym wielu pozytywnych opiniach prawdopodobnie praktycznie nigdy nie można go usunąć). Zamknięcie oznacza po prostu, że nie można uzyskać nowych odpowiedzi.
tacaswell

7
@Bushan Nie, nie chcemy dyskusji, chcemy pary pytań i odpowiedzi, które mają jasne odpowiedzi. To nie jest osąd, że jest to interesujące lub użyteczne pytanie, to kwestia bycia na temat dla SO. Na pewno zgadzasz się, że „Jaki jest najlepszy redaktor?” (obs emacs) nie jest konstruktywnym pytaniem, pytanie dotyczy dokładnie tej samej formy.
tacaswell

@tacaswell Niektóre dyskusje są bardzo istotne, jeśli chodzi o dopracowanie pytań do formatu pytań i odpowiedzi.
user32882

Odpowiedzi:


128

Być może słyszałeś o Pylint, który pomaga statycznie sprawdzać kod Pythona. Mało kto wie, że jest wyposażony w narzędzie o nazwie Pyreverse, które rysuje diagramy UML z czytanego kodu python. Pyreverse używa graphviz jako backendu.


czy wiesz, jak wizualizować prywatne metody zaczynające się od „_”
gustavz

1
Niestety diagramy pakietów pyreverse są ogromne, ponieważ wszystko jest umieszczone poziomo (bardziej ograniczenie grafviz, ale nadal). Nie nadaje się do włączenia do dokumentów.
wiosłowa

@oarfish jako obejście, możesz wybrać moduły, które chcesz dołączyć, i utworzyć kilka osobnych wykresów.
jjmontes

95

Epydoc to narzędzie do generowania dokumentacji API z kodu źródłowego Python. Generuje również diagramy klas UML, używając Graphviz w fantazyjny sposób. Oto przykład diagramu wygenerowanego z kodu źródłowego samego Epydoc.

Ponieważ Epydoc wykonuje zarówno introspekcję obiektu, jak i parsowanie źródła, może gromadzić więcej informacji dotyczących analizatorów kodu statycznego, takich jak Doxygen: może sprawdzać spore ilości dynamicznie generowanych klas i funkcji, ale może także wykorzystywać komentarze lub nieprzypisane ciągi jako źródło dokumentacji, np. dla zmiennych i publicznych atrybutów klasy.


Czy jest jakiś sposób, aby wyświetlała grafikę wektorową zamiast gifów? Nie znalazłem żadnej dokumentacji na ten temat, a wykresy są dość bezużyteczne dla niczego innego niż dokument HTML.
wiosłowa

3
Obecnie epydocwydaje się , że nie można wygenerować wykresów. Sprawdź ten raport o błędach .
Luís de Sousa,

14
nie działa z python 3
tomsv

23

2
Moje narzędzie UML typu open source Pynsource pynsource.com, o którym mowa na powyższej stronie, uległo wielu zmianom w wersji, o której wspomniano. Teraz analizuje Python 3, ma powiększenie, układ, ASCII UML i obsługę renderowania PlantUML. O ile mi wiadomo, Pynsource jest jedynym narzędziem UML, które rozpoznaje atrybuty instancji Pythona (nie tylko atrybuty klasy). Oznacza to, że wyrażenia takie jak self.myattr spowodują poprawny atrybut „myattr” w wynikowej klasie UML. Gotowe do uruchomienia pliki binarne są dostępne dla komputerów Mac, Windows, Ubuntu 18 i 16 - a także repozytorium Github typu open source.
abulka

8

Niektóre klasy dobrze zachowujących się programów mogą być schematyczne, ale w ogólnym przypadku nie można tego zrobić. Obiekty Pythona mogą być rozszerzane w czasie wykonywania, a obiekty dowolnego typu można przypisywać do dowolnej zmiennej instancji. Ustalenie, do jakich klas obiekt może zawierać wskaźniki (skład), wymagałoby pełnego zrozumienia działania programu w czasie wykonywania.

Możliwości metaklasy Pythona oznaczają, że rozumowanie dotyczące struktury dziedziczenia wymagałoby również pełnego zrozumienia zachowania programu w czasie wykonywania.

Aby udowodnić, że jest to niemożliwe, argumentujesz, że gdyby istniał taki diagrammator UML, możesz wziąć dowolny program, przekonwertować instrukcje „halt” na instrukcje, które miałyby wpływ na diagram UML, i użyć diagrammera UML do rozwiązania problemu zatrzymania, co jak wiemy jest niemożliwe.


8
Kilka dobrych rzeczy, ale zrujnowanie ręki rozwiązuje sprawę. Przypadki patologiczne nie mają tu znaczenia. Wystarczy dobre zachowanie.
ddaa

Co masz na myśli mówiąc „rezygnacja z ręki”? Nie wypisałem pełnych dowodów, ale podałem wystarczającą ilość informacji, aby każdy, kto widział podobne dowody, mógł je utworzyć, jeden do składu, a drugi do dziedziczenia.
Andru Luvisi,

14
Oto analogia: diff / patch może zawieść na wiele różnych sposobów, niektóre z nich są trywialne. Nadal jest bardzo przydatny w wielu rzeczywistych przypadkach. W uzasadnionych przypadkach dziedziczenie diagramów jest banalne. Delegowanie jest trudniejsze, ale wykonalne na podstawie wnioskowania o typie w granicach pakietu.
ddaa

7

Jeśli używasz zaćmienia, być może PyUML . Jednak nie użyłem tego.


1
To naprawdę dobra sugestia, ale FWIW zauważam na stronie projektu PyUML, że jeszcze nie obsługują Eclipse 3.4 (Ganymede). Z niecierpliwością czekam na wypróbowanie go, kiedy to rozwiążą.
Bill Karwin

Czy zdarzyło Ci się, że PyUML pracuje z 3.4?
anijhaw

2
Ostatnie zatwierdzenia dla tego projektu pochodzą z 2009 roku. Nie pojawia się on w Marketplace, a Eclipse nie może zainstalować go z .ziparchiwum.
Luís de Sousa,


5

Umbrello też to robi. w menu przejdź do Kod -> importuj projekt, a następnie wskaż katalog główny swojego projektu. to odwraca kod dla ciebie ...


czy znasz sposób, aby Umbrello wygenerował pełny diagram klas (i relacje między nimi, a nie tylko same klasy - nie pamiętam, jak nazywa się ten schemat)
vlad-ardelean

2
AAhh, musisz zaimportować pliki, a następnie podczas przeciągania i upuszczania klas w obszarze rysunku połączenia są dodawane automatycznie.
Hosane


4

SPE IDE ma wbudowane UML twórcy. Wystarczy otworzyć pliki w SPE i kliknąć kartę UML.

Nie wiem, jak wyczerpujący jest dla twoich potrzeb, ale nie wymaga żadnych dodatkowych pobrań ani konfiguracji do użycia.


niestety, przestał się rozwijać, ale nadal działa tutaj! (2013)
Abdelouahab,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.