<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
今天來給小夥伴推薦兩款實用的便於偵錯Python程式碼的工具,可以方便展示我們偵錯程式碼的中間狀態,提升大家的編碼效率。
在日常工作中,經常寫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是一個旨在使Python中的紀錄檔顯示變得有趣的庫。Loguru提供了許多有趣的功能,但我發現該庫最有用的一個功能是捕獲程式異常並顯示導致程式碼失敗的變數值。
我們可以使用pip來直接進行安裝,程式碼如下:
pip install loguru
為了理解Loguru是如何工作的,假設我們現在有兩個函數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)]
。
執行上述程式碼後,我們會出現以下錯誤:
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
通過上述輸出,我們知道程式碼行 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時導致函數出現異常錯誤資訊。
如果我們編寫完的程式碼經過偵錯後沒有了錯誤,但我們想弄清楚程式碼執行時發生了什麼?這就是snoop派上用場的情形。
snoop是一個第三方的Python包,通過只新增一個裝飾器可以方便地列印正在執行的程式碼行以及每個變數的值。
同樣我們依然可以通過pip
來安裝snoop
庫,程式碼如下:
pip install snoop
假設我們有一個名為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
為了理解為什麼函數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)}")
輸出如下:
在上述輸出中,我們可以檢視變數的值以及實際程式碼執行情形。進而通過上述輸出,我們可以更好地理解遞迴的工作原理!
文章重點介紹了兩種跟蹤和視覺化Python程式碼執行的工具。我希望通過使用這兩款偵錯工具,來大大提升大家的工作效率和定位問題的能力。
到此這篇關於分享方便偵錯Python程式碼的2個實用工具的文章就介紹到這了,更多相關 Python偵錯程式碼工具內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45