文章目录
- 一、起因
- 二、函数关系可视化
- 1.安装配置
- (1)graphviz
- (2)pycallgraph
- 2.使用
一、起因
你写代码是一文到底吗?
还是会分分结构:有类,有构造函数,有主函数
你了解过你写的类继承关系吗?
平常用IDEA写Java时,经常会查看:(选中你的函数,快捷键
Ctrl+Alt++Shift+U
查看函数关系)
通过
函数关系
我们可以很好的对类和函数进行统一规范重命名、调整结构等:
参考:
我在想:python有没有能够查看函数关系图的功能呢?
一翻查阅之后,发现了python库——graphviz+pycallgraph也是可以实现的,效果如下:
查看函数关系,调整函数结构,优雅的布局让你的代码有更好的可读性!
二、函数关系可视化
环境:Win10+anaconda
pycallgraph 可以创建python函数关系可视化图形;又因为其依赖于dot命令,需要先安装 graphviz。
1.安装配置
(1)graphviz
- 下载
一个图形可视化软件,可使用dot文件生成关系图。(有win10和Linux版,官网是外网下载可能很慢)
快速下载链接:http://www.graphviz.org/download/ - 将安装后的路径填写到环境变量中
(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
图片,也是美滋滋!
因为自己画的函数关系图是在太乱了,可能出错: