从Python源代码生成UML图的最佳方法是什么?

388

一位同事希望从大量的Python源代码生成UML类图。他主要关心继承关系,稍微关注组合关系,对于只是Python原始类型的类属性不太在意。

源代码相当直观,没有什么复杂的元类魔法等。它主要是基于Python 1.5.2时代的,还有一些“现代”的2.3ish的东西。

有什么最好的现有解决方案可以推荐吗?


73
版主认为这个问题没有建设性,但我和许多其他收藏了它的人觉得它很有用。那又怎样?这不是比“缺乏建设性”更重要的事情吗! - yati sagade
27
不建设性,因为它会引发辩论、争议、讨论。但这难道不是我们想要的吗?这是一个非常相关的问题... - Bhushan
10
不,我们不想讨论,我们想要有清晰答案的问题和答案对。这不是对问题是否有趣或有用的评价,而是关于是否符合SO主题的问题。您一定同意,“什么是最好的编辑器?”(如emacs)并不是一个有建设性的问题,这个问题也是完全相同的模式。 - tacaswell
18
@tacaswell 我来这里是为了寻找生成UML图的“一种”方法,而不是“最好的”方法,我相信其他人也是如此。因此,管理员们可以(应该?)建议更适合的替代方法,而不仅仅是关闭它。这将更具建设性,不是吗? - antonimmo
8
不要试图阻止人们问一些显然正常的问题,而是应该重新调整规则,允许这些问题。或者只需将它们放入意见部分,而不是简单地对其说“不能”。 - wamster
显示剩余4条评论
9个回答

234

你可能听说过Pylint,它可以帮助静态检查Python代码。但很少有人知道它还带有一个名为Pyreverse的工具,可以从读取的Python代码中绘制UML图表。Pyreverse使用Graphviz作为后端。

使用方法如下:

pyreverse -o png -p yourpackage .

其中.也可以是单个文件。


7
不幸的是,由于所有内容都被水平放置(这更多是graphviz的限制,但仍然存在),因此pyreverse包图非常庞大。不适合用于文档中。 - oarfish
5
输出类型的显然选择不应该是“-o pdf”吗?可扩展,可搜索。 - schlimmchen
1
有很多旧链接指向手动下载和安装旧版本的pylint。最新版本可以通过pip install pylint或者如果你的频道之一是conda-forge,则可以通过conda install pylint找到。 - Jim Pivarski
4
只需添加选项--filter-mode=ALL即可。 - craymichael
1
链接已经失效,文档在 https://pylint.pycqa.org/en/latest/pyreverse.html。 - Ashwin Kumar k
显示剩余3条评论

105

Epydoc 是一个从 Python 源代码生成 API 文档的工具。它还可以使用 Graphviz 以炫酷的方式生成 UML 类图。这里是 Epydoc 自身源代码生成的 示例图

Epydoc 可以执行对象内省和源码解析,因此可以收集比 Doxygen 等静态代码分析器更多的信息: 它可以检查相当数量的动态生成的类和函数,但也可以使用注释或未分配的字符串作为文档来源,例如用于变量和类公共属性。


有没有办法输出矢量图形而不是gif?我没有找到相关文档,而且这些图表除了HTML文档之外几乎没什么用处。 - oarfish
4
目前,epydoc 似乎无法生成图表。请查看此错误报告 - Luís de Sousa
31
不支持 Python 3 - tomsv
1
我刚刚使用Python 3.7.1进行了测试,并生成了一些图表。 - may
2
@may 你是怎么使用它的?我的Python报错了 print '\n' + msg.rstrip() + '\n',提示 SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)? - Pablo LION
显示剩余2条评论

13

一些表现良好的程序可以绘制成图表,但在一般情况下,这是不可能的。Python对象可以在运行时扩展,并且任何类型的对象都可以赋值给任何实例变量。要找出一个对象可以包含指针的类(组合)需要完全理解程序的运行时行为。

Python的元类功能意味着推论继承结构也需要完全理解程序的运行时行为。

要证明这是不可能的,你可以认为如果存在这样的UML图表生成器,则可以将任意程序中的“halt”语句转换为会影响UML图表的语句,并使用UML图表生成器来解决停机问题,但我们知道这是不可能的。


12
有些好的东西,但是停滞不前的概念抽象化破坏了它。这里不讨论病态情况,只要行为良好就可以了。 - ddaa
1
你说的“手摆动”是什么意思?我没有写出完整的证明,但我提供了足够的信息,任何看过类似证明的人都可以为组合和继承分别创建它们。 - Andru Luvisi
23
这里有一个比喻:diff/patch 可以在很多不同的方式下失败,其中一些方式是微不足道的。尽管如此,在许多实际情况下,它仍然非常有用。在合理的情况下,绘制继承关系图是微不足道的。委托更加棘手,但在包的界限内可以通过类型推断来实现。 - ddaa

8
如果您使用Eclipse,也许可以尝试PyUML。虽然我没有使用过它。

1
这是一个非常好的建议,但是值得一提的是,我发现在PyUML项目网站上他们还不支持Eclipse 3.4(Ganymede)。等他们解决了这个问题后,我期待着尝试它。 - Bill Karwin
你是否已经成功地将PyUML与3.4版本配合使用了? - anijhaw
3
这个项目的最后提交日期追溯到2009年。它没有出现在Marketplace中,Eclipse也无法从.zip归档文件中安装它。 - Luís de Sousa
真可惜,这是个很棒的名字 :) - undefined

8
值得一提的是,Gaphor 是一个Python建模/UML工具。

6
是一个小型应用程序设计师,其中包括UML。您可以在以下链接中找到它:

vipera

祝一切顺利!


5

SPE IDE具有内置的UML创建器。只需在SPE中打开文件,然后点击UML选项卡即可。

我不知道它是否符合您的需求,但使用它无需进行任何额外的下载或配置。


很遗憾它已经停止开发了,但仍然可以在这里使用!(2013年) - Abdelouahab

5

Sparx的企业建模工具可以循环处理Python源代码。他们提供了一份免费的时间限制试用版。


5

Umbrello也可以做到这一点。在菜单中选择Code->import project,然后指向您的项目根目录。然后它会为您反转代码...


你知道如何让Umbrello生成完整的类图(包括它们之间的关系,而不仅仅是单个类 - 我不记得这张图叫什么)吗? - vlad-ardelean
2
啊,你需要导入文件,然后当你将类拖放到绘图区域时,连接会自动添加。 - Hosane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接