GsB*_*GsB 5 python uml pyreverse
我在使用 生成 UML 时遇到问题pyreverse,特别是当类不属于同一模块时以及使用绝对导入时,对于组合关系。
为了说明问题,我有以下两个模块a.py并且b.py位于同一个包中:
a.py:
from b import B
class A:
def __init__(self, b):
self.b: B = b
Run Code Online (Sandbox Code Playgroud)
b.py:
class B:
pass
Run Code Online (Sandbox Code Playgroud)
pyreverse当我在终端中从包运行命令时,我得到以下 UML。它没有显示两个类A和之间的组成关系B:
from .b import B但是,当我在 中进行相对导入时a.py,我得到了预期的结果:
似乎pyreverse在第一种情况下不认识到类B是相同的。为了解决这个问题,我尝试将包的绝对路径添加到环境变量中PYTHONPATH。然而,这并没有解决问题。
有谁知道当类在不同模块中定义时以及使用绝对导入时如何pyreverse在 UML 中生成正确的关系?
我正在使用 python 3.8.8 和 pylint 版本 2.12.2。
根据额外的实验编辑答案
我不是 python 专家,但经过几次实验,我想我得到了你需要的信息
在我的第一个实验中,我使用了几个不在包中的模块。当使用不同的方式进行导入时,pyreverse仅显示命令行中提到的模块的类。
虽然我最初认为该问题与更严格的导入语法有关,但事实证明,它实际上只是按照手册页中的设计和记录工作: pyreverse 在图中仅显示了pyreverse 命令行中列出的模块的类。
因此,对于一个小项目,几乎使用文件中的定义 main.py,a.py并且b.py获取图中所有类的简单解决方法是pyresverse main.py a.py b.py在单个命令行上使用。它生成图表:
然而,结果似乎还取决于PYTHONPATH、调用pyreverse 的当前目录以及用于指定模块的路径,因为这些元素可能会影响正确导入的查找。
然后我将其重命名main.py为__init__.py制作一个包。然后,我可以使用pyreverse 仅提供包的目录名称(或者 . 如果它是当前工作目录)。然后处理包中的所有文件来制作类图,而不需要枚举它们。
从包目录中对包使用pyreverse 可以与您的导入语法配合使用,并生成与上面类似的图表。然而,从其父目录运行 Pyreverse 会并排生成 2 个没有关系的类。这意味着我们正在处理两个不同的类,B其中一个类未找到。使用相对导入解决了这个问题。
顺便说一句,我发现-m y通过添加模块名称来添加选项来消除类名称的歧义很有用:
我可以通过实验验证:每当我获得未链接的类时,从与pyreverse相同的当前工作目录启动python中的模块会导致导入错误。
| 归档时间: |
|
| 查看次数: |
2459 次 |
| 最近记录: |