如何从 python 代码生成 UML 图

How to generate the UML diagram from the python code

提问人:Pygirl 提问时间:11/4/2023 最后编辑:ChristophePygirl 更新时间:11/4/2023 访问量:60

问:

我有这个代码存储库

我创建了手动 UML,如下所示:enter image description here

我正在尝试通过 pyreverse 自动生成 UML:

pyreverse -o png -p ShoppingCart ./mainService.py

原生不支持格式 png。Pyreverse 将尝试生成 它使用 Graphviz...

不幸的是,它给了我空白的图表。我该怎么做才能在图中获取项目的类?

这是文件结构:

.
├── Entity
│   ├── Apple.py
│   ├── Buy1Get1FreeApple.py
│   ├── Buy3OnPriceOf2Orange.py
│   ├── Offer.py
│   ├── Orange.py
│   ├── Product.py
│   └── ShoppingCart.py
├── Enum
│   └── ProductType.py
└── mainService.py
python uml 类图 pyreverse

评论

1赞 Tim Roberts 11/4/2023
您是否安装了 或 ,正如文档告诉您的那样?graphvizdot
0赞 Pygirl 11/4/2023
是的,我确实安装了 graphviz,因为当时我遇到了一些与此模块相关的错误,并且还需要此模式。用brew install graphviz
0赞 Pygirl 11/4/2023
dot -V也有效 -->dot - graphviz version 9.0.0 (20230911.1827)
0赞 Christophe 11/4/2023
错误消息绝对正常。它只是告诉它不是 pyreverse 的内部格式。问题在于,考虑到您没有正确打包模块,命令行不完整。

答:

1赞 Christophe 11/4/2023 #1

总之

假设 pyreverse 和 graphviz 的安装是正确的,您需要做的就是打包您的项目,在每个文件夹中添加一些空__init__py文件。或者,您必须在命令行中手动添加所有模块。

更多细节 - 一步一步

关于错误消息

假设所有东西都安装正确,你的命令行应该会给你警告消息,这是绝对正常的:

原生不支持格式 png。Pyreverse 将尝试生成 它使用 Graphviz...

怎么了?

该图将保持为空,因为您告诉 pyreverse 分析单个文件,并且该文件中没有定义任何类。如果要手动添加要分析的不同模块:

pyreverse -o png -p ShoppingCart mainService.py Entity\Apple.py Enum\ProductType.py Entity\Orange.py Entity\ShoppingCart.py

然后,您将很好地获得一个基本的图表:

four classes side by side

如果预先添加选项,则可以递归方式获得项目中的所有祖先和所有关联的类:-AS

enter image description here

如何打包您的项目?

这很麻烦。幸运的是,打包您的项目几乎没有遗漏。如需完整参考,您可以查看此处。但简而言之,在项目文件夹中添加一个空文件就足够了,并且每个子文件夹都存储了模块:__init__.py

.
├── Entity
│   ├── __init__.py                   <<===== add this empty file
│   ├── Apple.py
│   ├── Buy1Get1FreeApple.py
│   ├── Buy3OnPriceOf2Orange.py
│   ├── Offer.py
│   ├── Orange.py
│   ├── Product.py
│   └── ShoppingCart.py
├── Enum
│   ├── __init__.py                   <<===== add this empty file
│   └── ProductType.py
├── __init__.py                       <<===== add this empty file
└── mainService.py

然后,您将能够运行更简单的命令行:

pyreverse -AS -o png -p ShoppingCart .

并得到这张宏伟的图表:

enter image description here

打包帮助 python 和 pyreverse 理解这些不是要单独分析的文件,而是在由子包等组成的包的上下文中。

评论

0赞 Pygirl 11/4/2023
感谢您的链接并提供详细的答案。它仅显示 eligibleProduct 下的一些变量。不是描述性的。是因为方法/数据内存是受保护的和私有的吗?
1赞 Christophe 11/4/2023
@Pygirl确实,似乎在没有双下划线的情况下重命名它,例如 offerType 会在图表上显示它。另一方面,__offerOnProduct在图上显示为“角色”(从语法上讲,它应该位于目标类一侧的末尾,但它就在那里。对于其他变量,您还需要知道 pyreverse 可以做什么有一些限制,例如请参阅另一个问题:stackoverflow.com/a/76147751/3723423(更正)或 stackoverflow.com/q/72388388/3723423(pyreverse 合著者之一在评论中确认的答案)