【Python】二、debuglib.py,调试利器

本文介绍了Python调试库debuglib.py的使用,包括程序计时、过程与变量监控、格式化输出、查看对象类型与成员等功能。通过实例展示了dprint、Timer等工具的使用,帮助开发者提高调试效率。此外,文章还强调了错误处理和阅读raise抛出错误的重要性。
摘要由CSDN通过智能技术生成

后记补充

我们整个工具包都开源了:https://github.com/XLPRUtils/pyxllib

并且放在pypi,可以使用下述方式安装:

pip install pyxllib

常见基础功能可以使用
from pyxllib.basic import *

原来的debuglib功能可以使用
from pyxllib.debug import *
dprint、chrome等函数的功能都在,而且后来有很多bug的修复完善。

但目前还可能有不少不稳定的地方,欢迎遇到bug随时提给我,或者使用别扭的地方可以反馈建议给我。

有在计划写文档了,但目前还不是很完善,可以将就先看着用用: https://www.yuque.com/xlpr/pyxllib
更多使用细节规范,暂时可以阅读源码,很多函数的接口还是讲的比较详细的。

0 序

如果下述问题也困扰着你,又或仍在使用“新手做法”,那么本文值得一读。

常见问题 新手做法 debuglib分享方法 标准处理方法
程序计时,速度性能分析 t0 = time.clock()

print(‘xxx用时%.2f\n’ % (time.clock() - t0))
timer = Timer(‘xxx’, start_now=True)

timer.stop_and_report()
timeit模块
IDE的Profile功能
查看程序是否运行到某个位置 print(123)

print(321)
dprint() IDE断点功能
查看变量值,监控过程 print(a)
print(‘a=’, a)
dprint(a, b, c) IDE监控变量
log日志模块
异常警告 不处理特殊情况或者直接raise报错 dprint(a, b) # 异常信息 warnings模块
表格等数据的对齐输出 靠火眼金睛看print的输出 chrome() pprint模块
pandas模块
查看对象的类型和成员变量、方法 不知道变量是什么类型,
吐槽动态语言不好用
showdir(ob) 跳转查源码Structure
查官方文档

上面第4列给出了这些问题工程上比较规范的做法,有不清楚的读者自己找资料了解,网上的资料很多本文不过多介绍,重点是要分享我的debuglib.py工具。如果把标准做法看成是PhotoShop软件,那么我所要分享的工具就是美图秀秀,论专业和严谨我的工具自然是无法和IDE的调试功能相比的,但有时候我们只是遇到一个小问题,杀鸡焉用牛刀?我的工具有一些精巧的设计封装,一切设计都是为了便捷、方便快速,又比“新手做法”的“画图软件”强大的多。

后文的介绍依赖debuglib.py源码 ,不过也不需要用里面的所有代码,读者有感兴趣的功能可以做代码摘选而不是复制整个脚本文件来使用。有些函数接口支持非常灵活的扩展功能,本文无法面面俱到地介绍,有需要使用的读者可以读源码,源码中也有很完善的文档注释。

当然,毕竟不是标准的调试操作,这些东西必然存在争议,也欢迎大家的评论和优化。
希望我的代码至少能给大家带来调试效率方面的思索和灵感。
这些技巧并不局限于Python语言,这是用任何编程语言开发都值得思考的问题。

作者:陈坤泽

邮箱:877362867@qq.com

1 程序计时

time.clock()是有bug的,不同的平台应该使用的计时器不同,最好用timeit中的配置:timeit.default_timer。考虑到还有输出计时标签、多次运行计算平均时间等需求,我们可以封装好一个Timer类更方便使用。

def demo_timer():
    """该函数也可以用来测电脑性能"""
    print('1、普通用法(循环5*1000万次用时)')
    timer = Timer('循环', start_now=True)
    for _ in range(5):
        for _ in range(10 ** 7):
            pass
    timer.stop_and_report()

    print('2、循环多轮计时(循环5*1000万次用时)')
    timer = Timer()
    for _ in range(5):
        timer.start()
        for _ in range(10 ** 7):
            pass
        timer.stop_and_report()

    print('3、with上下文用法')
    with Timer('循环'):
        for _ in range(5):
            for _ in range(10 ** 6):
                pass

    # 1、普通用法(循环5*1000万次用时)
    # 循环 CumuTime: 0.834s, #run: 1, AvgTime: 0.834s
    # 2、循环多轮计时(循环5*1000万次用时)
    # CumuTime: 0.157s, #run: 1, AvgTime: 0.157s
    # CumuTime: 0.314s, #run: 2, AvgTime: 0.157s
    # CumuTime: 0.470s, #run: 3, AvgTime: 0.157s
    # CumuTime: 0.626s, #run: 4, AvgTime: 0.157s
    # CumuTime: 0.787s, #run: 5, AvgTime: 0.157s
    # 3、上下文用法
    # 循环 CumuTime: 0.080s, #run: 1, AvgTime: 0.080s

2 过程与变量监控

2.1 查看程序是否运行到某个位置

假设我们现在要开发一个计算 a b m o d    m a^b \mod m abmodm的程序,从一个有问题的代码来举例如何用dprint工具进行排查解决bug。
初始test.py代码如下:

a, b, m = map(int, input().split())  # 从控制台输入一行字符串,例如`2 2 3`,读取成3个整数值
if m is True:
    n = a ^ b
    a = n % m
print(a
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值