不再使用 Print 來Debug了, IceCream 來了!
寫在前面
在編程過程中,Bug幾乎是不可避免的。其實大部分程序員花了大量的時間進行Debug(調(diào)試),以使他們的代碼沒有Bug。?
在調(diào)試時,最常用的方法無疑是選擇使用print()語句來了解 pipeline 流程以及發(fā)現(xiàn)bug。
然而,使用print()有許多注意事項,例如:
- 打印語句通常是為了向用戶顯示一個輸出。如果程序員使用print()?進行調(diào)試,在調(diào)試結束后,程序員應該謹慎地只刪除那些特定的print()語句,這些語句是用來調(diào)試的。
- 通常,在調(diào)試期間,你可能會一個接一個地打印多個變量。在這種情況下,程序員必須手動格式化輸出以增強其可讀性。
上面,我們打印了兩個變量。雖然在這里我們知道第一個變量是var_1?,第二個是var_2,但隨著變量數(shù)量的增加,可能需要你在代碼和輸出之間來回尋找,以找出哪個輸出對應于哪個變量。
當然,我們可以打印更多的細節(jié),像下面這樣,但這只是增加了你的工作,如果我們一直在做像這樣的工作,不就需要996了。
- 有時,程序員可能還需要對打印行號、函數(shù)名稱及其輸入等,這增加了編寫又長、又多的print()語句的復雜性。
- 在大多數(shù)情況下,代碼庫不只限于一個文件。相反,有多個文件組成管道。在這種情況下,人們可能有興趣在調(diào)試時也顯示文件的名稱,而用print()會很麻煩。
上述原因使得print()(至少對我來說)成為最糟糕的調(diào)試選項。
值得慶幸的是,在Python中有一個很好的替代方案 —— IceCream[1] ??!
IceCream
IceCream是一個Python庫,它使Debug不費吹灰之力,并能用最少的代碼查看調(diào)試結果。
它常用的功能包括打印表達式、變量名、函數(shù)名、行號、文件名等等。
安裝 IceCream
你可以使用 pip?來安裝 icecream庫。
導入IceCream
使用這個庫的標準慣例是導入ic模塊,如下所示。
開始使用IceCream
使用 IceCream 庫就像 print 語句一樣簡單。你需要把 print()? 替換為 ic()。就是這樣。
注意區(qū)別!ic()不僅打印值,而且還打印所傳遞的變量的名稱。
IceCream 不僅僅局限于一個變量。相反,你可以在函數(shù)、類等方面使用它。
超酷!它打印了方法的名稱(func?),傳遞的參數(shù)(3?)和輸出(6)。
每一個進入ic()?方法的表達式?都會被打印出來,同時還有表達式的數(shù)值,如下圖所示。
Icecream同時打印表達式和它的值
用 IceCream Debug 也可以應用于普通的 Python 數(shù)據(jù)結構。下面是一個Python字典的例子。
檢查執(zhí)行情況
很多時候,程序員使用print()來顯示有意義的(有時是隨機的)語句來確定程序的流程。
IceCream也可以避免那些奇怪的聲明。
只要調(diào)用ic()就可以了。它將打印文件名、行號和其他細節(jié)(如函數(shù)名,如果有的話)以及時間。這樣看,是不是非常簡單。
使用IceCream項目范圍
接下來,你可能會想,print() 函數(shù)是Python 的內(nèi)置庫,使用方便,不需每次都import。而我們的IceCream 是否需要在每個Python文件中都導入這個庫?當然不是!
為了使方法在所有項目文件中可用,在根文件中導入icecream的install模塊,如下所示。
通過install,ic()可以在整個項目中使用。
添加一個自定義前綴
如果你注意到上面,ic()?語句的輸出以"ic|"開始。那是IceCream提供的默認前綴。
然而,如果由于某種原因,你希望用一個自定義的前綴來代替它,我們可以通過在 ic.configureOutput()? 方法中指定 prefix 參數(shù)來實現(xiàn)的,如下所示。
調(diào)試后刪除IceCream語句
一旦你的代碼調(diào)試結束,你可能想刪除所有不必要的調(diào)試語句。
由于ic()?語句在語法上與print()?不同,你可以在編輯器中搜索"ic("模式并刪除這些語句,如下所示。
從代碼中刪除ic()語句
另外,你可以使用ic.disable()?來停止ic()?的打印。如果你想再次使用它們,請使用ic.enable()。
寫在最后
用print()語句進行調(diào)試是一種混亂的、不優(yōu)雅的方法。將輸出映射到其相應的調(diào)試語句是很混亂的。此外,它需要額外的手動格式化來理解輸出。
如上所述,Python 中的 IceCream 庫是一個很好的替代品。它使調(diào)試不費吹灰之力,可讀性強,代碼最少。如果你覺得本文對你有所幫助,可以點個贊和在看!
參考資料:
[1]IceCream: https://github.com/gruns/icecream