詳解Python調(diào)試神器之PySnooper
相信很多程序員在調(diào)試代碼時,都用過 print。代碼少還好說,如果是大型項目,面對眾多 print 的輸出結(jié)果,可能要頭大了。
今天推薦一個 GitHub 熱門開源項目:PySnooper。該項目推出的第一天就收獲 2000+ Star,登上了 GitHub 日榜第一位,如今有近 15k Star??梢娺@是一款 Python 開發(fā)者喜歡的工具。歡迎收藏學(xué)習(xí)、喜歡點贊支持,文末技術(shù)交流可以暢聊!

鏈接:https://github.com/cool-RR/PySnooper
PySnooper 是個什么東西?
如果你寫的 Python 代碼不能按如期那樣運行,你會絞盡腦汁想為啥出錯了。雖然你希望有支持?jǐn)帱c的成熟調(diào)試器,但或許你現(xiàn)在不想去設(shè)置這樣的調(diào)試器。
你想知道哪些行代碼是正常運行,哪些行不正常。據(jù)說大多數(shù)人會在可疑位置使用 print 輸出語句。
其實 PySnooper 的作用有點類似,你不用小心翼翼地用 print 輸出,只需在想調(diào)試的函數(shù)中引入一個裝飾器。然后得到函數(shù)的詳細(xì)日志,包括運行了哪些行、何時運行,以及何時更改了局部變量。
為什么 PySnooper 能從其他智能調(diào)試工具中脫穎而出?
因為你可以在不需要進行任何設(shè)置的情況下將其用于糟糕的、龐大的企業(yè)代碼庫中。只需打開裝飾器(如下示例所示),并將輸出重定向到一個專用的日志文件,將日志文件路徑指定為第一個參數(shù)。
PS:如果無法訪問 stderr,那可以將輸出重定向到指定文件,比如 :@pysnooper.snoop('/my/log/file.log')
使用范例
范例是一個把數(shù)字轉(zhuǎn)成二進制的函數(shù)。
import pysnooper
@pysnooper.snoop()
def number_to_bits(number):
if number:
bits = []
while number:
number, remainder = divmod(number, 2)
bits.insert(0, remainder)
return bits
else:
return [0]
number_to_bits(6)
輸出結(jié)果
Starting var:.. number = 6
21:14:32.099769 call 3 @pysnooper.snoop()
21:14:32.099769 line 5 if number:
21:14:32.099769 line 6 bits = []
New var:....... bits = []
21:14:32.099769 line 7 while number:
21:14:32.099769 line 8 number, remainder = divmod(number, 2)
New var:....... remainder = 0
Modified var:.. number = 3
21:14:32.099769 line 9 bits.insert(0, remainder)
Modified var:.. bits = [0]
21:14:32.099769 line 7 while number:
21:14:32.099769 line 8 number, remainder = divmod(number, 2)
Modified var:.. number = 1
Modified var:.. remainder = 1
21:14:32.099769 line 9 bits.insert(0, remainder)
Modified var:.. bits = [1, 0]
21:14:32.099769 line 7 while number:
21:14:32.099769 line 8 number, remainder = divmod(number, 2)
Modified var:.. number = 0
21:14:32.099769 line 9 bits.insert(0, remainder)
Modified var:.. bits = [1, 1, 0]
21:14:32.099769 line 7 while number:
21:14:32.099769 line 10 return bits
21:14:32.099769 return 10 return bits
如果你不想追蹤整個函數(shù),那可以用 with 塊包裝你想追蹤的那部分,如下:
import pysnooper
import random
def foo():
lst = []
for i in range(10):
lst.append(random.randrange(1, 1000))
with pysnooper.snoop():
lower = min(lst)
upper = max(lst)
mid = (lower + upper) / 2
print(lower, mid, upper)
foo()
輸出結(jié)果
New var:....... i = 9
New var:....... lst = [681, 267, 74, 832, 284, 678, ...]
09:37:35.881721 line 10 lower = min(lst)
New var:....... lower = 74
09:37:35.882137 line 11 upper = max(lst)
New var:....... upper = 832
09:37:35.882304 line 12 mid = (lower + upper) / 2
74 453.0 832
New var:....... mid = 453.0
09:37:35.882486 line 13 print(lower, mid, upper)
Elapsed time: 00:00:00.000344
如何安裝?
最佳方式:pip
$ pip install pysnooper
其他方式:
- Conda:
$ conda install -c conda-forge pysnooper - Arch Linux:
$ yay -S python-pysnooper - Fedora Linux:
dnf install python3-pysnooper
技術(shù)交流
歡迎轉(zhuǎn)載、收藏、有所收獲點贊支持一下!

以上就是詳解Python調(diào)試神器之PySnooper的詳細(xì)內(nèi)容,更多關(guān)于Python PySnooper的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python通用讀取vcf文件的類(復(fù)制粘貼即可用)
這篇文章主要介紹了python通用讀取vcf文件的類(可以直接復(fù)制粘貼使用) ,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02
Tkinter使用Progressbar創(chuàng)建和管理進度條的操作代碼
Progressbar是Tkinter庫中的一個小部件,用于創(chuàng)建和管理進度條,這篇文章主要介紹了Tkinter使用Progressbar創(chuàng)建和管理進度條,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
在Python中操作字典之setdefault()方法的使用
這篇文章主要介紹了在Python中操作字典之setdefault()方法的使用,是Python入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-05-05
基于YUV 數(shù)據(jù)格式詳解及python實現(xiàn)方式
今天小編就為大家分享一篇基于YUV 數(shù)據(jù)格式詳解及python實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
Python入門Anaconda和Pycharm的安裝和配置詳解
這篇文章主要介紹了Python入門Anaconda和Pycharm的安裝和配置詳解,文章通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
簡單了解Python下用于監(jiān)視文件系統(tǒng)的pyinotify包
這篇文章主要介紹了Python下用于監(jiān)視文件系統(tǒng)的pyinotify包,pyinotify基于inotify事件驅(qū)動機制,需要的朋友可以參考下2015-11-11

