Python 代码一键转流程图
在设计程序时,类图、流程图都是非常有用的工具。我们有很多工具可以绘制这些图形,甚至有些工具能够生成最基本的框架代码。除了在设计时使用外,很多时候我们也需要将已经写好的代码反向转成类图或流程图,尤其是在分享设计或写作业时。
代码转类图
转换代码为类图的工具有很多,常见的 IDE 如 VS Code、IntelliJ IDEA 都可以安装插件来完成这项工作。如果你使用的是微软的开发环境,Visual Studio 提供的“类设计器”功能,尤其强大,轻松超越了其他类似工具,可以称得上是“宇宙第一 IDE”。
代码转流程图
相较于类图,代码转流程图的需求较少,且现有工具相对较少。最近我需要将一些 Python 代码转化为流程图,经过搜索,我发现现有的实现都有一定的不足:要么使用了非常奇怪的技术(如正则表达式,简直让我震撼一下午),要么依赖环境过于苛刻(比如依赖某些不适合 macOS 的 PyGame 库),要么生成的流程图丑到极致(乱七八糟的线条、奇怪的颜色)。
看到一个高赞的 GitHub 项目 Vatsha/code_to_flowchart,它集合了上述几种“优点”,我决定自己动手做一个 Python 到流程图的转换工具。
PyFlowchart 的设计
当然,我不是在喷 Vatsha/code_to_flowchart,毕竟它的设计简单有效,利用 PyGame 做可视化也非常有创意。不过,我认为它在细节上仍有很大的改进空间,特别是它的界面和代码结构。
我参考了这个项目,并基于 flowchart.js 实现了自己的工具,命名为 PyFlowchart。起初我取名为 PyFlow,但在上传到 PyPi 时发现已被占用,于是改成了 PyFlowchart。
flowchart.js
如果你使用 Typora,可能知道在 Typora 中使用 flow
可以通过简单的文本语言来写流程图。根据 Typora 文档,这个功能来自于开源的 flowchart.js。
我将 Python 代码转化为这种 flowchart 文本语言,借助 flowchart.js.org、Typora 或 francoislaberge/diagrams 等工具生成流程图。
例如:
st=>start: Start
op=>operation: Your Operation
cond=>condition: Yes or No?
e=>end
st->op->cond
cond(yes)->e
cond(no)->op
PyFlowchart
接下来简要介绍如何使用我实现的 PyFlowchart。更详细的说明请参考项目的 README。
安装 PyFlowchart:
$ pip3 install pyflowchart
创建一个 simple.py
文件:
def foo(a, b):
if a:
print("a")
else:
for i in range(3):
print("b")
return a + b
运行 PyFlowchart:
$ python3 -m pyflowchart simple.py
它将输出如下的 flowchart 代码:
st4439920016=>start: start foo
io4439920208=>inputoutput: input: a, b
cond4439920592=>condition: if a
sub4439974736=>subroutine: print('a')
io4439974672=>inputoutput: output: (a + b)
e4439974352=>end: end function return
cond4439974224=>operation: print('b') while i in range(3)
st4439920016->io4439920208
io4439920208->cond4439920592
cond4439920592(yes)->sub4439974736
sub4439974736->io4439974672
io4439974672->e4439974352
cond4439920592(no)->cond4439974224
cond4439974224->io4439974672
生成流程图
你可以将上述生成的代码粘贴到 flowchart.js.org 的文本框中,右侧会自动生成流程图。
另外,如果你使用 Typora,可以直接将这些代码放入 flow
代码块中,Typora 会自动生成流程图。或者,你也可以使用命令行工具 francoislaberge/diagrams 来生成流程图。
如果生成的流程图不满意(如线条重叠),或者你想自定义样式,可以手动修改 flowchart 代码,非常方便。
实现原理
- 开始: PyFlowchart
- 输入 Python 源代码
- 代码转 AST
- AST 转节点图
- 节点图转流程图
- 输出流程图
- 结束
PyFlowchart 使用 Python 内置的 ast 包将代码转换为 AST(抽象语法树),然后将 AST 转换为自定义的节点(Node),这些节点在 flowchart 中对应不同类型的图形元素。遍历这些节点,即可生成完整的流程图。
关于 AST 包
ast
包允许我们将 Python 代码解析成一种数据结构,便于分析和操作。举例来说,下面是将 Python 代码转为 AST 的过程:
import ast
expr = """
def add(a, b):
return a + b
"""
expr_ast = ast.parse(expr)
ast.dump(expr_ast)
输出的 AST 可以帮助我们理解 Python 代码的结构。
PyFlowchart 的设计
Node 是最基础的类,代表流程图中的一个节点。其他节点类型(如 StartNode
、EndNode
、OperationNode
)都继承自它。通过 fc_definition()
和 fc_connection()
方法,这些节点可以转化为 flowchart 语言的字符串。
NodesGroup 是一个特殊的节点,它本身不会出现在流程图中,但可以包含其他节点(例如,if 语句或循环的嵌套结构)。
AstNode 用于将 AST 对象转换为节点对象,它的子类分别对应 AST 中的不同节点类型(如 If
、Loop
、Return
)。
Flowchart 类代表整个流程图,它是 NodesGroup
的子类,包含了所有节点的集合,并能将它们输出为完整的 flowchart 代码。
项目地址与类图
项目地址:PyFlowchart GitHub
版权声明
本文为CSDN博主「CDFMLR」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012419550/article/details/109258117
以上就是我对文档的重新整理。希望它能让你更容易阅读和理解内容!