在程式開發過程中,代碼的運作往往會和我們預期的結果有所差别。于是,我們需要清楚代碼運作過程中到底發生了什麼?代碼哪些子產品運作了,哪些子產品沒有運作?輸出的局部變量是什麼樣的。我們一般會加一些調試語句,比如加一些print或者log。代碼少還好說,如果是大型項目,面對衆多 print 的輸出結果,可能不太好定位。下面推薦python的PySnooper包
PySnooper 是個什麼東西?
PySnooper是一款成熟的調試器,與logging和iceream的作用類似,可以通過pip install PySnooper安裝
為什麼PySnooper能從其他智能調試工具中脫穎而出?
因為你可以在不需要進行任何設定的情況下将其用于糟糕的、龐大的企業代碼庫中。
PySnooper主要作用
1、重定向到日志
import pysnooper
@pysnooper.snoop(output='../debug.log')
def demo_func():
dict_list = dict()
dict_list["name"] = "dyf"
dict_list["age"] = 18
dict_list["gender"] = "female"
return dict_list
demo_func()
2、跟蹤非局部變量
跟蹤非局部變量值 PySnooper 是以函數為機關進行調試的,它預設隻會跟蹤函數體内的局部變量,若想跟蹤全局變量,可以給 pysnooper.snoop() 加上 watch 參數
import pysnooper
out = {"foo": "bar"}
@pysnooper.snoop(watch='out["foo"]')
def demo_func():
dict_list = dict()
dict_list["name"] = "dyf"
dict_list["age"] = 18
dict_list["gender"] = "female"
return dict_list
demo_func()
和watch 相對的,pysnooper.snoop() 還可以接收一個函數 watch_explode,表示除了這幾個參數外的其他所有全局變量都監控。
@pysnooper.snoop(watch_explode=('foo', 'bar'))
def demo_func():
dict_list = dict()
dict_list["name"] = "dyf"
dict_list["age"] = 18
dict_list["gender"] = "female"
return dict_list
demo_func()
3、設定跟蹤函數的深度
#當你使用 PySnooper 調試某個函數時,若該函數中還調用了其他函數,PySnooper 是不會傻傻的跟蹤進去的。如果你想繼續跟蹤該函數中調用的其他函數,可以通過指定 depth 參數來,設定跟蹤深度(不指定的話預設為 1)
# 跟蹤函數中調用其他函數的執行過程
@pysnooper.snoop(depth=2)
def demo_func_new():
return '我是一個函數'
@pysnooper.snoop(depth=2)
def demo_func():
demo = demo_func_new()
print(demo)
dict_list = dict()
dict_list["name"] = "dyf"
dict_list["age"] = 18
dict_list["gender"] = "female"
return dict_list
demo_func()
4、設定調試日志的字首
#當你在使用 PySnooper 跟蹤多個函數時,調試的日志會顯得雜亂無章,不友善檢視。在這種情況下,PySnooper 提供了一個參數,友善你為不同的函數設定不同的标志,友善檢視日志時進行區分
#4、設定調試日志的字首
@pysnooper.snoop(output="../debug.log", prefix="demo_func: ")
5、設定最大的輸出長度
預設情況下,PySnooper 輸出的變量和異常資訊,如果超過 100 個字元,被會截斷為 100 個字元。當然你也可以通過指定參數 進行修改
@pysnooper.snoop(max_variable_length=200) # 限制長度為200
@pysnooper.snoop(max_variable_length=None) # 不限制長度
6、支援多線程調試模式
PySnooper 同樣支援多線程的調試,通過設定參數 thread_info=True,它就會在日志中列印出是在哪個線程對變量進行的修改。
如果感覺文章對你有幫助的話可以點個關注,歡迎關注公衆号:橙好測試開發,可以免費獲得測試開發學習資料!