使用绝对导入时,pyreverse 不会在 UML 中显示组合关系

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。

Chr*_*phe 3

根据额外的实验编辑答案

我不是 python 专家,但经过几次实验,我想我得到了你需要的信息

第一次实验:无包

在我的第一个实验中,我使用了几个不在包中的模块。当使用不同的方式进行导入时,pyreverse仅显示命令行中提到的模块的类。

虽然我最初认为该问题与更严格的导入语法有关,但事实证明,它实际上只是按照手册页中的设计和记录工作 pyreverse 在图中仅显示了pyreverse 命令行中列出的模块的类。

因此,对于一个小项目,几乎使用文件中的定义 main.pya.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中的模块会导致导入错误。