介紹如何在 Python 中使用 icecream
模組幫助開發者進行程式的測試與除錯。
IceCream 是一套專門用於輸出除錯訊息的 Python 模組,其功能類似 print()
函數,但是在輸出除錯訊息時更方便。
icecream
模組icecream
模組可透過 pip
安裝:
# 安裝 icecream 套件
pip install icecream
傳統上在程式開發時若要查看變數的內容,通常都會使用 print()
函數:
#!/usr/bin/python3 # 測試用變數 a = 123 b = "ABC" # 以 print 輸出除錯資訊 print("a =", a) print("b =", b)
a = 123 b = ABC
這種狀況就可以改用 IceCream 的 ic()
函數來輸出除錯用的資訊,使用上會比 print()
更方便:
#!/usr/bin/python3 from icecream import ic # 測試用變數 a = 123 b = "ABC" # 以 IceCream 輸出除錯資訊 ic(a) ic(b)
ic| a: 123 ic| b: 'ABC'
使用 ic()
函數代替 print()
函數來輸出除錯資訊有幾個優點:
對於結構比較複雜的變數,也很適合用 ic()
函數輸出:
# 輸出資料結構 d = {'key': {1: 'one'}} ic(d)
ic| d: {'key': {1: 'one'}}
輸出函數的呼叫資訊與計算結果:
# 輸出函數計算結果 def foo(i): return i + 333 ic(foo(123))
ic| foo(123): 456
在程式開發階段,我們時常會需要觀察程式的執行邏輯與順序是否正確,就會在程式之中加入許多 print
函數輸出執行的資訊:
#!/usr/bin/python3 def foo(a): print("呼叫 foo 函數") # ... if a == 1: print("處理 a == 1 的狀況") # ... else: print("處理其他狀況") # ... foo(1)
呼叫 foo 函數 處理 a == 1 的狀況
這種狀況可以改用 IceCream 來處理:
#!/usr/bin/python3 from icecream import ic def foo(a): ic() # ... if a == 1: ic() # ... else: ic() # ... foo(1)
若呼叫 ic()
函數時不帶任何參數,就會自動輸出指令稿的名稱、所在位置的行號、所在函數名稱、執行的時間點。
假設這個 Python 指令稿的名稱為 myscript.py
,則執行的輸出就會類似這樣:
ic| myscript.py:5 in foo() at 11:55:26.998 ic| myscript.py:9 in foo() at 11:55:26.999
ic
函數會傳回原始變數值,所以可以輕易放在程式碼的任何位置:
#!/usr/bin/python3 from icecream import ic # ic 函數會傳回原始變數值 a = 1 b = ic(a) + 1 ic(b)
ic| a: 1 ic| b: 2
ic()
函數預設會將除錯資訊輸出至標準錯誤(stderr),而 ic.format()
則可以將除錯資訊以字串傳回:
#!/usr/bin/python3 from icecream import ic a = 123 # 將除錯資訊以字串傳回 b = ic.format(a) print(b)
ic| a: 123
ic.enable()
與 ic.disable()
函數可以用於啟用與停用輸出除錯資訊:
#!/usr/bin/python3 from icecream import ic ic(1) # 停用輸出除錯資訊 ic.disable() ic(2) # 啟用輸出除錯資訊 ic.enable() ic(3)
ic| 1 ic| 3