介紹如何在 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
