分享2個方便調試Python代碼的實用工具
1. 引言
今天來給小伙伴推薦兩款實用的便于調試Python代碼的工具,可以方便展示我們調試代碼的中間狀態(tài),提升大家的編碼效率。
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的第三方包,來實現(xiàn)上述調試效果。我們來看如下兩款第三方Python包:
- Loguru: 更好的打印程序異常
- snoop: 打印函數(shù)中正在執(zhí)行的代碼行
好了,接下來我們就來一個個的介紹這些好用的工具吧。
3. Loguru
Loguru是一個旨在使Python中的日志顯示變得有趣的庫。Loguru提供了許多有趣的功能,但我發(fā)現(xiàn)該庫最有用的一個功能是捕獲程序異常并顯示導致代碼失敗的變量值。
3.1 安裝
我們可以使用pip來直接進行安裝,代碼如下:
pip install loguru
3.2 舉個栗子
為了理解Loguru是如何工作的,假設我們現(xiàn)在有兩個函數(shù)division
和divide_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)]?
?。
運行上述代碼后,我們會出現(xiàn)以下錯誤:
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 ?
?是錯誤發(fā)生的地方,但是我們并不清楚??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時導致函數(shù)出現(xiàn)異常錯誤信息。
4. Snoop
如果我們編寫完的代碼經過調試后沒有了錯誤,但我們想弄清楚代碼運行時發(fā)生了什么?這就是snoop派上用場的情形。
4.1 安裝
snoop是一個第三方的Python包,通過只添加一個裝飾器可以方便地打印正在執(zhí)行的代碼行以及每個變量的值。
同樣我們依然可以通過pip
來安裝snoop
庫,代碼如下:
pip install snoop
4.2 舉例
假設我們有一個名為factorial
的函數(shù),它主要用于實現(xiàn)計算整數(shù)的階乘。
代碼如下:
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
為了理解為什么函數(shù)factorial
的輸出值為20,我們可以通過添加snoop
的裝飾器來查看函數(shù)的調用情形,
代碼如下:
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代碼執(zhí)行的工具。我希望通過使用這兩款調試工具,來大大提升大家的工作效率和定位問題的能力。
到此這篇關于分享方便調試Python代碼的2個實用工具的文章就介紹到這了,更多相關 Python調試代碼工具內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
用Python的pandas框架操作Excel文件中的數(shù)據(jù)教程
這篇文章主要介紹了用Python的pandas框架操作Excel文件中的數(shù)據(jù)教程,包括單位格式轉換、分類匯總等基本操作,需要的朋友可以參考下2015-03-03