一位同事希望从大量的Python源代码中生成UML类图。 他主要对继承关系感兴趣,对组合关系稍有兴趣,不太关心仅仅是Python原语的类属性。
源代码非常简单,也不是特别邪恶——例如,它没有使用任何花哨的元类魔法。(它主要来自Python 1.5.2时代,有一些“现代”2.3之类的东西。)
现有的最好的解决方案是什么?
一位同事希望从大量的Python源代码中生成UML类图。 他主要对继承关系感兴趣,对组合关系稍有兴趣,不太关心仅仅是Python原语的类属性。
源代码非常简单,也不是特别邪恶——例如,它没有使用任何花哨的元类魔法。(它主要来自Python 1.5.2时代,有一些“现代”2.3之类的东西。)
现有的最好的解决方案是什么?
某些行为良好的程序类可以用图表表示,但在一般情况下,这是不可能的。Python对象可以在运行时进行扩展,任何类型的对象都可以分配给任何实例变量。要弄清楚一个对象可以包含指向哪些类的指针(组合),需要完全理解程序的运行时行为。
Python的元类功能意味着关于继承结构的推理还需要完全理解程序的运行时行为。
为了证明这是不可能的,您认为如果存在这样一个UML图表,那么您可以取任意的程序,将“停止”语句转换为会影响UML图表的语句,并使用UML图表来解决停止问题,正如我们所知道的,这是不可能的。
Epydoc是一个从Python源代码生成API文档的工具。它还使用Graphviz生成UML类图。下面是一个从Epydoc本身的源代码生成的图表示例。
由于Epydoc同时执行对象内省和源解析,它可以收集与静态代码分析器(如Doxygen)有关的更多信息:它可以检查相当数量的动态生成的类和函数,但也可以使用注释或未赋值的字符串作为文档源,例如变量和类公共属性。
您可能听说过帮助静态检查Python代码的Pylint。很少有人知道它附带了一个名为Pyreverse的工具,可以从它读取的Python代码中绘制UML图。Pyreverse使用Graphviz作为后端。
它是这样使用的:
pyreverse -o png -p yourpackage .
哪里。也可以是单个文件。