Python中如何实现debug可视化?

本文介绍了Python库birdseye如何实现代码的debug可视化。通过birdseye,我们可以对函数进行装饰,它利用AST(抽象语法树)修改函数,通过Flask构建web服务展示调试信息。文章详细解释了birdseye的工作流程,包括获取AST、监控函数执行和构建web服务,并强调了对Python ast和inspect库的理解对于理解birdseye的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

00560016e3d070c8abc305cd89f68c5b.jpeg

本文,我们学习一个叫birdseye的库,看看它是怎么实现Python代码debug可视化的。

先简单看看它的效果。

我用递归,写了一段生成斐波那契数列的函数,然后我用birdseye中的eye对函数进行装饰

from birdseye.server import main
from birdseye import eye

@eye
def fibonacci(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

fibonacci(10)

main()

运行后,birdseye会启动一个web服务,通过这个web,我们可以很直观地调试与观察fibonacci函数中的各种数值。

效果如下:875a2d3ae68c959b255650450f123ab8.png

这里,就不多讨论,怎么用它了,你可以直接看项目的github:https://github.com/alexmojaki/birdseye

本文主要要学习一下,人家是怎么做到这种效果的。

birdseye原理

还是老话,阅读任何一个项目的源码,都要有一个目的,因为代码里全是细节,如果没有目的,容易在细节里迷失。

我们阅读birdseye项目源码的目的主要就是:可视化debug是怎么实现的?

基于一开始的例子,我们很自然的,可以从eye装饰器入手,代码如下:

# birdseye/__init__.py

class _SimpleProxy(object):
    def __init__(self, val):
        # 设置了新的属性
        object.__setattr__(self, '_SimpleProxy__val', val)

    def __call__(self, *args, **kwargs):
        return self.__val()(*args, **kwargs)

    def __getattr__(self, item):
        return getattr(self.__val(), item)

    def __setattr__(self, key, value):
        setattr(self.__val(), key, value)

eye = _SimpleProxy(lambda: import_module('birdseye.bird').eye)

eye其实是类装饰器,通过Python的动态import机制(import_module)将birdseye.bird中的eye引入。

在一开始,我不太理解,为啥要特意定义_SimpleProxy类将birdseye.bird.eye包裹多一层,其实就是通过_SimpleProxy类将其变为装饰器,birdseye.bird.eye则是具体的逻辑。

当项目运行时,eye装饰器会让_SimpleProxy类的__call__函数被调用,从而执行birdseye的业务逻辑。

为了避免迷茫,这里先概述一下birdseye的原理,经过学习,birdseye做到可视化debug主要通过下面几步:

  • 1.通过eye装饰器获得被装饰函数的AST(抽象语法树)

  • 2.修改AST,实现对函数中的每个语句(stmt&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒编程-二两

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值