別用 print() 找 bug 啦!用 IceCream 吧!
Posted on Aug 1, 2023 in Python 模組/套件推薦 by Amo Chen ‐ 2 min read
雖然用 print() 找 bug 實在方便,不過用 print() 經常要寫上很多資訊才夠清楚,例如 print(f"line 5, value={v}")
,而且事後還要記得刪除,避免不小心把它提交(commit)進去 codebase 😭
現在你有更好的選擇了,用 IceCream 吧!
本文環境
- Python 3
- IceCream 2.1.3
$ pip install icecream
IceCream
用 IceCream 過程完全跟用 print() 一樣,不過再也不需要手刻除錯訊息了, IceCream 自動會標示表達式(expression)以及變數值,例如:
from icecream import ic
def test_ic(a):
return a + 1
ic(test_ic(1))
上述範例執行結果為,可以看到 IceCream 清楚地將表達式以及其回傳值標出,完全不需要我們多寫額外訊息:
ic| test_ic(1): 2
標示行數
不過有時候,我們還是會希望有行數的資訊輔助我們判斷到底執行到哪一行有問題, IceCream 也能夠自動標示行數,只要額外設定 ic.configureOutput(includeContext=True)
就會標示檔名、行數以及呼叫 ic 的函數名稱:
from icecream import ic
ic.configureOutput(includeContext=True)
def test_ic(a):
ic(a)
return a + 1
ic(test_ic(0))
上述範例執行結果如下,可以看到 ic 有清楚標示第 6 行是在函式 test_ic()
內,當時的變數 a 值為 0 :
ic| ic_ex1.py:6 in test_ic()- a: 0
ic| ic_ex1.py:10 in <module>- test_ic(0): 1
修改除錯訊息的前綴(prefix)
IceCream 預設使用 ic|
作為除錯訊息的前綴字串,如果要更改可以呼叫 ic.configureOutput(prefix='<字串>')
進行修改:
from icecream import ic
ic.configureOutput(prefix='debug > ')
def test_ic(a):
ic(a)
return a + 1
ic(test_ic(0))
上述範例執行結果如下,可以看到 ic|
字串已經被換掉:
debug > a: 0
debug > test_ic(0): 1
停用 IceCream
如果怕不小心提交錯誤訊息到 codebase, 或者想在 production 停用除錯訊息,可以搭配環境變數使用,當判斷是 production 環境時就呼叫 ic.disable()
停用:
import os
from icecream import ic
if os.getenv('PRODUCTION') == "true":
ic.disable()
def test_ic(a):
if a == 0:
ic(a == 0)
else:
ic(a != 0)
test_ic(0)
總結
IceCream 是很方便的模組,而且設計蠻簡潔優雅的,有興趣的話可以到官方 GitHub 上閱讀更多使用方法!
以上!
Happy Coding!
References
https://github.com/gruns/icecream