【问题标题】:What's the best way to generate a UML diagram from Python source code? [closed]从 Python 源代码生成 UML 图的最佳方法是什么? [关闭]
【发布时间】:2010-09-20 14:00:49
【问题描述】:

一位同事希望从大量 Python 源代码中生成 UML 类图。 他主要对继承关系感兴趣,对组合关系稍微感兴趣,不太关心只是 Python 基元的类属性。

源代码非常简单明了,也不是非常邪恶——例如,它没有做任何花哨的元类魔法。 (它主要来自 Python 1.5.2 的时代,还有一些“现代”2.3 的东西。)

推荐最好的现有解决方案是什么?

【问题讨论】:

  • Mods 没有发现这个问题有建设性。我(和许多喜欢这个的人)发现它很有用。所以呢? 那个不是比这更重要的不是“建设性的”!
  • 没有建设性,因为它会引起辩论、争论、讨论??????这不是我们想要的吗?这是一个非常相关的问题..
  • @Bhushan 不,我们不想要讨论,我们想要有明确答案的问答对。这不是判断它是一个有趣的问题还是一个有用的问题,而是一个关于 SO 的话题。你肯定同意“什么是最好的编辑器?” (obs emacs) 不是一个建设性的问题,这个问题完全一样。
  • @tacaswell 我来这里是为了寻找生成 UML 图的“一种”方法,而不是“最好的”方法,我相信其他人也是如此。因此,模组可以(应该?)提出更适合的替代方法,而不是仅仅关闭它。那会更有建设性,不是吗?
  • 与其试图让人们停止问某些明显正常的问题,不如重组他们的规则以允许这些类型的问题。也许只是简单地将它们放入意见部分,而不是仅仅给它一个大大的 NO?

标签: python uml diagram


【解决方案1】:

您可能听说过Pylint,它有助于静态检查 Python 代码。很少有人知道它带有一个名为Pyreverse 的工具,该工具可以从它读取的 Python 代码中绘制 UML 图。 Pyreverse 使用 Graphviz 作为后端。

它是这样使用的:

pyreverse -o png -p yourpackage .

. 也可以是单个文件。

【讨论】:

  • 你知道如何可视化以“_”开头的私有方法
  • 不幸的是,pyreverse 包图非常庞大,因为所有内容都是水平放置的(更多的是 graphviz 的限制,但仍然如此)。不适用于包含在文档中。
  • @oarfish 作为一种解决方法,您可以挑选要包含的模块,并创建几个单独的图表。
  • 输出类型的明显选择不应该是-o pdf吗?可扩展、可搜索。
  • @gustavz 只要通过选项--filter-mode=ALL
【解决方案2】:

Epydoc 是一个从 Python 源代码生成 API 文档的工具。它还以奇特的方式使用Graphviz 生成UML 类图。这是从 Epydoc 本身的源代码生成的an example of diagram

因为 Epydoc 执行对象自省和源解析,它可以收集更多关于静态代码分析器(如 Doxygen)的信息:它可以检查大量动态生成的类和函数,但也可以使用 cmets 或未分配的字符串作为文档来源,例如用于变量和类公共属性。

【讨论】:

  • 有没有办法让它输出矢量图而不是gif?我没有找到任何文档,而且这些图表对于 html doc 之外的任何内容都毫无用处。
  • 目前,epydoc 似乎无法生成图表。看看这个bug report
  • 不适用于 python 3
  • 我刚用python 3.7.1测试过,可以生成一些图表
  • @may 你是怎么使用它的?我的蟒蛇抱怨print '\n' + msg.rstrip() + '\n'SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
【解决方案3】:

【讨论】:

  • 上页提到的我的开源UML工具Pynsourcepynsource.com自被提及以来经历了多次版本变更。它现在解析 Python 3,具有缩放、布局、ASCII UML 和 PlantUML 渲染支持。据我所知,Pynsource 也是唯一能够识别 Python 实例属性(不仅仅是类属性)的 UML 工具。这意味着像 self.myattr 这样的表达式将在生成的 UML 类中产生一个适当的属性“myattr”。准备运行的二进制文件可用于 Mac、Windows、Ubuntu 18 和 16 - 以及开源 Github 存储库。
【解决方案4】:

某些类表现良好的程序可能是图表化的,但在一般情况下,它无法做到。 Python 对象可以在运行时扩展,任何类型的对象都可以分配给任何实例变量。弄清楚一个对象可以包含哪些类的指针(组合)需要全面了解程序的运行时行为。

Python 的元类功能意味着推理继承结构还需要全面了解程序的运行时行为。

为了证明这些是不可能的,您争辩说,如果存在这样的 UML 图表,那么您可以使用任意程序,将“暂停”语句转换为会影响 UML 图的语句,并使用 UML 图表解决停机问题,我们知道这是不可能的。

【讨论】:

  • 一些好事,但解决停止的手放弃破坏了它。病理病例不是这里的问题。乖乖就够了。
  • 你是什么意思,“放弃”?我没有写出完整的证明,但我提供了足够的信息,任何看过类似证明的人都可以创建它们,一个用于组合,一个用于继承。
  • 这是一个类比:diff/patch 可能以多种不同的方式失败,其中一些是微不足道的。它在许多现实世界的案例中仍然非常有用。在合理的情况下,图表继承是微不足道的。委派比较棘手,但通过包边界内的类型推断是可行的。
【解决方案5】:

值得一提的是Gaphor。 Python 建模/UML 工具。

【讨论】:

    【解决方案6】:

    如果您使用 Eclipse,可能是PyUML。不过没用过。

    【讨论】:

    • 这是一个非常好的建议,但我在 PyUML 项目网站上注意到他们还不支持 Eclipse 3.4 (Ganymede)。当他们解决这个问题时,我期待着尝试一下。
    • 您是否碰巧让 PyUML 与 3.4 一起工作?
    • 该项目的最后一次提交可以追溯到 2009 年。它没有出现在 Marketplace 中,Eclipse 也无法从 .zip 存档中安装它。
    【解决方案7】:

    SPE IDE 具有内置的 UML 创建器。只需在 SPE 中打开文件并单击 UML 选项卡。

    我不知道它对您的需求有多全面,但它不需要任何额外的下载或配置即可使用。

    【讨论】:

    • 遗憾的是它已经停止开发,但仍然可以在这里工作! (2013)
    【解决方案8】:

    Umbrello 也这样做。在菜单中转到代码 -> 导入项目,然后指向项目的根目录。然后它为你反转代码......

    【讨论】:

    • 你知道一种方法可以让 Umbrello 生成完整的类图(以及它们之间的关系,而不仅仅是类本身 - 不记得该图是如何调用的)
    • 啊啊啊,你需要导入文件,然后当你将类拖放到绘图区域时,连接会自动添加。
    【解决方案9】:

    vipera 是一个小型应用程序设计器,包含 uml。您可以在以下位置看到它:

    vipera

    最好的问候。

    【讨论】:

      【解决方案10】:

      Sparx 的 Enterprise Architect 执行 Python 源代码的往返。他们有免费的限时试用版。

      【讨论】:

        猜你喜欢
        • 2011-11-05
        • 2021-07-03
        • 1970-01-01
        • 1970-01-01
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        • 2020-09-06
        相关资源
        最近更新 更多