Python函数关系可视化图形(graphviz+pycallgraph)

一、起因

你写代码是一文到底吗?
在这里插入图片描述
还是会分分结构:

有类,有构造函数,有主函数
在这里插入图片描述
你了解过你写的类继承关系吗?

平常用IDEA写Java时,经常会查看:(选中你的函数,快捷键Ctrl+Alt++Shift+U查看函数关系)
在这里插入图片描述
通过函数关系我们可以很好的对类和函数进行统一规范重命名、调整结构等:
在这里插入图片描述
参考:IntelliJ IDEA中查看当前类的所有继承关系图

我在想:python有没有能够查看函数关系图的功能呢?

一翻查阅之后,发现了python库——graphviz+pycallgraph也是可以实现的,效果如下:
在这里插入图片描述
查看函数关系,调整函数结构,优雅的布局让你的代码有更好的可读性!

二、函数关系可视化

环境:Win10+anaconda

pycallgraph 可以创建python函数关系可视化图形;又因为其依赖于dot命令,需要先安装 graphviz。

1.安装配置

(1)graphviz

  1. 下载
    一个图形可视化软件,可使用dot文件生成关系图。(有win10和Linux版,官网是外网下载可能很慢)
    快速下载链接:http://www.graphviz.org/download/
  2. 将安装后的路径填写到环境变量中
    在这里插入图片描述

(2)pycallgraph

创建python函数关系可视化图形。可以直接安装。

pip install graphviz
pip install pycallgraph

2.使用

记住如果是修改了环境变量,需要重启jupyter或者idea。

from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput

with PyCallGraph(output=GraphvizOutput()):
    code_to_profile()

人吃香蕉的案例:

#!/usr/bin/env python
'''
This example demonstrates a simple use of pycallgraph.
'''
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
class Banana:

    def eat(self):
        pass
class Person:
    def __init__(self):
        self.no_bananas()
    def no_bananas(self):
        self.bananas = []
    def add_banana(self, banana):
        self.bananas.append(banana)
    def eat_bananas(self):
        [banana.eat() for banana in self.bananas]
        self.no_bananas()
def main():
    graphviz = GraphvizOutput()
    graphviz.output_file = 'basic1.png'

    with PyCallGraph(output=graphviz):
        person = Person()
        for a in range(10):
            person.add_banana(Banana())
        person.eat_bananas()
if __name__ == '__main__':
    main()

图片:
在这里插入图片描述

实践:(我将之前写的手势识别特征提取的模块封装成两个类,再写了一个调用函数)

下面内容存放在test.py中:
在这里插入图片描述
调用:

#!/usr/bin/env python
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
from test import * #引入外部函数和类

#也可以直接写在这里def getData():...

def main():
    graphviz = GraphvizOutput()
    graphviz.output_file = 'basic.png'#图片名称

    with PyCallGraph(output=graphviz):
        img_file = "images/letter/pear.jpg"    
        modelpath = "models/"
        info = getOpenposeInfo(img_file,modelpath)#调用你所需要绘制的函数
        print("[INFO]img_file",img_file)
        print("[INFO]Pose[25] and Hands[20]: ", info)



if __name__ == '__main__':
    main()

绘图效果如下:

在这里插入图片描述
除此之外,还可以设置函数忽略等(可以把辅助函数求角度距离和绘图函数隐藏了,只显示主流程调用,这样比较清晰),我没实践了,哈哈,以后补充~

其中遇到的问题:提醒了我多次:pose_model没有定义,
原因是因为在同一类种可以用self和命名定义,但在外部引用时,规范的写法都要写为self,这一点要注意:一个类里的函数相互调用,要用self注明
在这里插入图片描述
规范写法:
在这里插入图片描述
这也是规范我们代码的一次机会,哈哈,小毛病太多了~

更规范的写代码吧,也可以在项目汇报时,加入这个pycallgraph图片,也是美滋滋!

因为自己画的函数关系图是在太乱了,可能出错:
在这里插入图片描述
希望对你有用,记得点赞哦!

发布了246 篇原创文章 · 获赞 485 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/cungudafa/article/details/104897272
今日推荐