分享2个方便调试Python代码的实用工具

 更新时间:2022年05月24日 17:04:51   作者:sgzqc  
这篇文章主要介绍了分享方便调试Python代码的2个实用工具,可以方便展示我们调试代码的中间状态,提升大家的编码效率,详细的介绍需要的小伙伴可以参考一下下面文章内容

1. 引言

今天来给小伙伴推荐两款实用的便于调试Python代码的工具,可以方便展示我们调试代码的中间状态,提升大家的编码效率。

2. 动机

在日常工作中,经常写Python的小伙伴经常会遇到需要调试代码bug的情形,有时候我们Python的错误提示信息特别丑,

举例如下:

2 divided by 1 is equal to 2.0.
Traceback (most recent call last):
File "loguru_example.py", line 17, in <module>
divide_numbers(num_list)
File "loguru_example.py", line 11, in divide_numbers
res = division(num1, num2)
File "loguru_example.py", line 5, in division
return num1/num2
ZeroDivisionError: division by zero

如果你觉得尚可接受,那我们不妨来看下如下显示错误的方式:

哇偶,没有对比就没有伤害,看了上述的显示,有木有心动。
好滴,我们可以通过一些Python的第三方包,来实现上述调试效果。我们来看如下两款第三方Python包:

  • Loguru: 更好的打印程序异常
  • snoop: 打印函数中正在执行的代码行

好了,接下来我们就来一个个的介绍这些好用的工具吧。

3. Loguru

Loguru是一个旨在使Python中的日志显示变得有趣的库。Loguru提供了许多有趣的功能,但我发现该库最有用的一个功能是捕获程序异常并显示导致代码失败的变量值。

3.1 安装

我们可以使用pip来直接进行安装,代码如下:

pip install loguru

3.2 举个栗子

为了理解Loguru是如何工作的,假设我们现在有两个函数divisiondivide_numbers

如下所示:

from itertools import combinations
def division(num1: int, num2: int):
return num1/num2
def divide_numbers(num_list: list):
"""Division of 2 numbers in the number list """
for comb in combinations(num_list, 2):
num1, num2 = comb
res = division(num1, num2)
print(f"{num1} divided by {num2} is equal to {res}.")
if __name__ =='__main__':
num_list = [2, 1, 0]
divide_numbers(num_list)

注意​​combinations([2,1,0], 2)​​返回值为​​[(2, 1), (2, 0), (1, 0)]​​。

运行上述代码后,我们会出现以下错误:

2 divided by 1 is equal to 2.0.
Traceback (most recent call last):
File "loguru_example.py", line 17, in <module>
divide_numbers(num_list)
File "loguru_example.py", line 11, in divide_numbers
res = division(num1, num2)
File "loguru_example.py", line 5, in division
return num1/num2
ZeroDivisionError: division by zero

3.3 使用Loguru

通过上述输出,我们知道代码行 ​​return num1/num2 ​​是错误发生的地方,但是我们并不清楚​​num1​​和​​num2​​的那些值导致的错误。幸运的是,我们可以通过添加Loguru的装饰器来捕捉此时的异常,

代码如下:

from loguru import logger
from itertools import combinations
def division(num1: int, num2: int):
return num1/num2
@logger.catch # Add this to track errors
def divide_numbers(num_list: list):
for comb in combinations(num_list, 2):
num1, num2 = comb
res = division(num1, num2)
print(f"{num1} divided by {num2} is equal to {res}.")
if __name__ =='__main__':
num_list = [2, 1, 0]
divide_numbers(num_list)

运行结果如下:

通过在代码中添加logger.catch,此时的异常情况更加容易被理解!我们通过观察此时的输出,可以明确的知道当2除以0时导致函数出现异常错误信息。

4. Snoop

如果我们编写完的代码经过调试后没有了错误,但我们想弄清楚代码运行时发生了什么?这就是snoop派上用场的情形。

4.1 安装

snoop是一个第三方的Python包,通过只添加一个装饰器可以方便地打印正在执行的代码行以及每个变量的值。
同样我们依然可以通过pip来安装snoop库,代码如下:

pip install snoop

4.2 举例

假设我们有一个名为factorial的函数,它主要用于实现计算整数的阶乘。

代码如下:

import snoop
def factorial(x: int):
if x == 1:
return 1
else:
return (x * factorial(x-1))
if __name__ == "__main__":
num = 5
print(f"The factorial of {num} is {factorial(num)}")

输出如下:

The factorial of 5 is 120

 

4.3 使用factorial

为了理解为什么函数factorial的输出值为20,我们可以通过添加snoop的装饰器来查看函数的调用情形,

代码如下:

import snoop
@snoop
def factorial(x):
if x == 1:
return 1
else:
return (x * factorial(x-1))
if __name__ == "__main__":
num = 5
print(f"The factorial of {num} is {factorial(num)}")

输出如下:

在上述输出中,我们可以查看变量的值以及实际代码运行情形。进而通过上述输出,我们可以更好地理解递归的工作原理!

5. 总结

文章重点介绍了两种跟踪和可视化Python代码执行的工具。我希望通过使用这两款调试工具,来大大提升大家的工作效率和定位问题的能力。

到此这篇关于分享方便调试Python代码的2个实用工具的文章就介绍到这了,更多相关 Python调试代码工具内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python random库使用方法及异常处理方案

    Python random库使用方法及异常处理方案

    这篇文章主要介绍了python random库使用方法及异常处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 浅谈Python任务自动化工具Tox基本用法

    浅谈Python任务自动化工具Tox基本用法

    这篇文章主要介绍了浅谈Python任务自动化工具Tox,tox 是一个管理测试虚拟环境的命令行工具, 它已存在多年且广被开发者们使用,对Python任务自动化工具Tox基本用法感兴趣的朋友一起看看吧
    2022-06-06
  • python 异常捕获详解流程

    python 异常捕获详解流程

    异常即非正常状态,在Python中使用异常对象来表示异常。若程序在编译或运行过程中发生错误,程序的执行过程就会发生改变,抛出异常对象,程序流进入异常处理。如果异常对象没有被处理或捕捉,程序就会执行回溯(Traceback)来终止程序
    2022-03-03
  • tensorflow: variable的值与variable.read_value()的值区别详解

    tensorflow: variable的值与variable.read_value()的值区别详解

    今天小编就为大家分享一篇tensorflow: variable的值与variable.read_value()的值区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Python随机数模块详情

    Python随机数模块详情

    这篇文章主要介绍了Python随机数模块,随机数模块实现了各种分布的伪随机数生成器。对于整数,从范围中有统一的选择。 对于序列,存在随机元素的统一选择、用于生成列表的随机排列的函数、以及用于随机抽样而无需替换的函数,下文来看看详细内容,需要的朋友可以参考一下
    2021-11-11
  • Python使用socket模块实现简单tcp通信

    Python使用socket模块实现简单tcp通信

    这篇文章主要介绍了Python使用socket模块实现简单tcp通信,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • python中关于提升工作效率的一些小技巧

    python中关于提升工作效率的一些小技巧

    这篇文章主要介绍了python中关于提升工作效率的一些小技巧,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • pandas时间序列之如何将int转换成datetime格式

    pandas时间序列之如何将int转换成datetime格式

    这篇文章主要介绍了pandas时间序列之如何将int转换成datetime格式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Python使用XlsxWriter库操作Excel详解

    Python使用XlsxWriter库操作Excel详解

    XlsxWriter 是一个功能强大的 Python 模块,专门用于生成 Microsoft Excel 2007及以上版本的电子表格文件,本文主要为大家介绍了如何使用XlsxWriter库进行Excel基本操作,需要的可以参考下
    2023-11-11
  • Python实现密码薄文件读写操作

    Python实现密码薄文件读写操作

    这篇文章主要介绍了Python实现密码薄文件读写操作,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12

最新评论