文章目录

  • 一、起因
  • 二、函数关系可视化
  • 1.安装配置
  • (1)graphviz
  • (2)pycallgraph
  • 2.使用


一、起因

你写代码是一文到底吗?

python 外包 Python外包络图_可视化


还是会分分结构:有类,有构造函数,有主函数

python 外包 Python外包络图_pycallgraph_02


你了解过你写的类继承关系吗?

平常用IDEA写Java时,经常会查看:(选中你的函数,快捷键Ctrl+Alt++Shift+U查看函数关系)

python 外包 Python外包络图_pycallgraph_03


通过

函数关系

我们可以很好的对类和函数进行统一规范重命名、调整结构等:


python 外包 Python外包络图_pycallgraph_04


参考:

IntelliJ IDEA中查看当前类的所有继承关系图

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

一翻查阅之后,发现了python库——graphviz+pycallgraph也是可以实现的,效果如下:

python 外包 Python外包络图_python 外包_05


查看函数关系,调整函数结构,优雅的布局让你的代码有更好的可读性!

二、函数关系可视化

环境: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()

图片:

python 外包 Python外包络图_函数关系可视化_06

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

下面内容存放在test.py中:

python 外包 Python外包络图_可视化_07


调用:

#!/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()

绘图效果如下:

python 外包 Python外包络图_python 外包_08


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

其中遇到的问题:提醒了我多次:pose_model没有定义,
原因是因为在同一类种可以用self和命名定义,但在外部引用时,规范的写法都要写为self,这一点要注意:一个类里的函数相互调用,要用self注明

python 外包 Python外包络图_可视化_09


规范写法:


python 外包 Python外包络图_python 外包_10


这也是规范我们代码的一次机会,哈哈,小毛病太多了~

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

因为自己画的函数关系图是在太乱了,可能出错:

python 外包 Python外包络图_pycallgraph_11