別用 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

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!