詳解DeBug Python神級(jí)工具PySnooper
PySnooper 在 GitHub 上自嘲是一個(gè)“乞丐版”調(diào)試工具(poor man's debugger)。
一般情況下,在編寫(xiě) Python 代碼時(shí),如果想弄清楚為什么 Python 代碼沒(méi)有按照預(yù)期執(zhí)行、哪些代碼在運(yùn)行哪些沒(méi)在運(yùn)行、局部變量又是什么,我們會(huì)使用包含斷點(diǎn)和觀察模式等功能的調(diào)試器,或者直接使用 print 語(yǔ)句打印出來(lái)。
但上面的方法都比較麻煩,例如使用調(diào)試器需要進(jìn)行繁瑣的設(shè)置,使用 print 打印也要很仔細(xì)。與它們相比,使用 PySnooper 只需為要調(diào)試的函數(shù)添加一個(gè)裝飾器即可,這樣就能獲得運(yùn)行函數(shù)詳細(xì)的 log,包括執(zhí)行的代碼行和執(zhí)行時(shí)間,以及局部變量發(fā)生變化的確切時(shí)間。
之所以稱(chēng)為“乞丐版”,相信是因?yàn)?PySnooper 使用起來(lái)十分簡(jiǎn)單,開(kāi)發(fā)者可以在任何龐大的代碼庫(kù)中使用它,而無(wú)需進(jìn)行任何設(shè)置。只需添加裝飾器,并為日志輸出地址指定路徑。
安裝
pip3 install pysnooper
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)
返回日志如下
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
PySnooper特征
如果標(biāo)準(zhǔn)錯(cuò)誤輸出難以獲得,或者太長(zhǎng)了,那么可以將輸出定位到本地文件:
@pysnooper.snoop('/my/log/file.log')
查看一些非本地變量的值:
@pysnooper.snoop(variables=('foo.bar', 'self.whatever'))
展示我們函數(shù)中調(diào)用函數(shù)的 snoop 行:
@pysnooper.snoop(depth=2)
將所有 snoop 行以某個(gè)前綴開(kāi)始,更容易定位和找到:
@pysnooper.snoop(prefix='ZZZ ')
更可以用來(lái)獲取TensorFlow 的各種張量信息,十分強(qiáng)大。媽媽再也不用擔(dān)心我找不到bug啦!
(2019.5.7更新:有時(shí)會(huì)不起作用,不知是自己姿勢(shì)不對(duì)還是其他原因。)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python利用opencv實(shí)現(xiàn)SIFT特征提取與匹配
這篇文章主要為大家詳細(xì)介紹了python利用opencv實(shí)現(xiàn)SIFT特征提取與匹配,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03YOLOv5改進(jìn)之添加SE注意力機(jī)制的詳細(xì)過(guò)程
作為當(dāng)前先進(jìn)的深度學(xué)習(xí)目標(biāo)檢測(cè)算法YOLOv5,已經(jīng)集合了大量的trick,但是還是有提高和改進(jìn)的空間,針對(duì)具體應(yīng)用場(chǎng)景下的檢測(cè)難點(diǎn),可以不同的改進(jìn)方法,下面這篇文章主要給大家介紹了關(guān)于YOLOv5改進(jìn)之添加SE注意力機(jī)制的相關(guān)資料,需要的朋友可以參考下2022-08-08Python數(shù)據(jù)分析入門(mén)之教你怎么搭建環(huán)境
本篇文章要有一定的Python基礎(chǔ),知道列表,字符串,函數(shù)等的用法. 文中有非常詳細(xì)的代碼示例,對(duì)正在入門(mén)python數(shù)據(jù)分析的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05django框架事務(wù)處理小結(jié)【ORM 事務(wù)及raw sql,customize sql 事務(wù)處理】
這篇文章主要介紹了django框架事務(wù)處理,結(jié)合實(shí)例形式總結(jié)分析了使用ORM 事務(wù)及raw sql,customize sql 事務(wù)處理相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-06-06python中requests模擬登錄的三種方式(攜帶cookie/session進(jìn)行請(qǐng)求網(wǎng)站)
這篇文章主要介紹了python中requests模擬登錄的三種方式(攜帶cookie/session進(jìn)行請(qǐng)求網(wǎng)站),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Python?的矩陣傳播機(jī)制Broadcasting和矩陣運(yùn)算
這篇文章主要介紹了Python?的矩陣傳播機(jī)制Broadcasting和矩陣運(yùn)算,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06python中import和from-import的區(qū)別解析
這篇文章主要介紹了python中import和from-import的區(qū)別解析,本文通過(guò)實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12