Dro*_*ppi 5 python uml class-diagram pylint pyreverse
我正在尝试为使用 Unions 和 List 类型提示的类生成 UML 图。
一个例子是
from dataclasses import dataclass
from typing import Union
@dataclass
class ClassA:
name: str
@dataclass
class ClassB:
an_attribute: int
@dataclass
class ClassC:
my_class: Union[ClassA, ClassB]
Run Code Online (Sandbox Code Playgroud)
运行时pyreverse -ASmn stackoverflow_example.py -o png我获得一个未显示 classA 和 classB 用法的 UML:
如果我将代码替换ClassC为
@dataclass
class ClassC:
my_class: ClassA
Run Code Online (Sandbox Code Playgroud)
但是,当然,这意味着当我分配某种类型时,我ClassB会my_class收到突出显示的警告,这正是它应该做的。我对应该如何工作的理解Union是我会得到这样的东西:

该示例显示了 Union,但 List 和其他人也会有类似的行为。
有没有办法做到这一点,或者这是一个不应该这样做的设计?
根据PEP 484指定类型提示:
\n\n\n由 Union[T1, T2, ...] 分解的类型是所有类型 T1、T2 等的超类型,因此作为这些类型之一的成员的值对于由 Union[T1 注释的参数来说是可接受的,T2,...]。
\n
但在 UML 中,这需要一种中间类型,因为只能有一个my_class成员:
看看pyreverse的不同选项,我们能做的并不多:
\n-b您可以添加包含内置类型的选项。在这种情况下,您将看到所有类都继承自object,并且您将看到int并str 包括该类型的成员的组成。但Union仍然绝望地保持原样,并且没有显示出 PEP 484 所建议的任何内容。这表明pyreverse 不支持此功能。
Pyreverse 显示了与 Union 完全相同的行为,就好像您添加了一个不存在的类型(例如xxxx,甚至是无意义的,例如xxx [1,2,yyy]):它指示源文件中的字符串,但不绘制相应的字符串对象。这强化了缺乏支持的印象。
在上次的经验中,我在pyreverse中将示例文件与typing.py包一起处理。它很好地识别了包之间的依赖关系。但工会仍然没有改变。
\n使用替代语法ClassA | ClassB会导致图表略有不同,因为类型信息被完全删除,但也没有显示组合。
我只能得出结论,这个工具似乎不支持联合的图形渲染。
\nUnion 是一个实用的功能,但不是非常面向对象:
\n幸运的是,有一个简单的替代方法:使 A 和 B 成为一个公共空类(例如 AB)的子类,然后创建my_class一个AB. Pyreverse 然后生成预期结果:
| 归档时间: |
|
| 查看次数: |
1896 次 |
| 最近记录: |