debug是碼農們的基本技能,每個人都有自己擅長(習慣)的debug手段,比如蝦神年輕的時候,曾經在ms-dos平臺上寫過幾行C語言代碼,那個時代,IDE是這個樣子的:
在這種IDE下面,debug是一種極度痛苦的事情,所以就養(yǎng)成了print調試的習慣:所有的編程語言debug手段,都基于這兩種:比如蝦神才畢業(yè)的時候,還寫過幾天javascript,那個時代沒有專用的IDE,也沒有專用的JS調試工具,所以調試的時候,滿頁面寫滿alert……后來,到了寫Python的時候,各種IDE已經很成熟了,但是一直養(yǎng)成習慣,老讓我不自覺的時候在debug的時候,寫滿了print,然后打包發(fā)布的時候,清理代碼搞得焦頭爛額。一般來說,調試還是通過IDE進行斷點步進,效率是最高的,效果也是最好,但是,很多時候,print有著不可替代的作用,比如遠程在linux上用過shell調試Python腳本的時候;又如在jupyter notebook需要進行調試的時候;再如用Pandas的apply函數的時候;斷點都不用好,更不用說,多線程編程的時候,斷點調試基本上就是被廢掉了。直到我后面發(fā)現了一個Python的debug神包:pysnooper。可能老Python碼農們早就用上這個工具包,不過鑒于蝦神的讀者,還是以GIS圈子的同學比較多,所以覺得還有必要給大家推介一下這個神奇的debug工具。
使用,就更簡單了,導入,然后寫一個裝飾器(不知道啥是裝飾器的同學,去參考其他文章,如果懶得去了解,就硬記下來這樣用就行):
方法很簡單,求素數(啥叫素數,自己去放小學數學)。(PS:素數是數論里面一個很有意思的問題,它在逐步計算到它自身之前,都無法判斷,只能逐步迭代,沒有快速判定,用數學家的說法:素數隨機的出現在數軸上,無法預先判定,素數號稱數論的皇冠,各種數學大佬們們都對它進行了研究,恐怖如斯……)
從100計算到200,第一輪循環(huán)的時候,i = 100,當 j = 2的時候,flag就已經等于false,跳出循環(huán)。然后第二輪循環(huán),i = 101,j =2開始,一直到sqrt(101)+1,也就是2-11,迭代之后,發(fā)現都沒有因子,所以得到101是素數,加入到p這個List中:
從以上debug輸出結果可以看出,PySnooper輸出信息主要包括以下幾個部分:也就是說,把我們日常DEBUG所需要的主要信息都輸出出來了。而且還有運行的時間,這樣還可以用來調試代碼效率。當然,你也可以選擇輸出成日志,這樣還可以后續(xù)分析,比如:

當然,為了區(qū)別多個function,也可以加前綴:


加入知識星球【我們談論數據科學】
500+小伙伴一起學習!
· 推薦閱讀 ·
geopandas輕松繪制交互式在線地圖
地圖可視化:geopandas繪制拓撲著色地圖
新一代Python包管理工具來了