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