新聞中心
寫在前面
在編程過程中,Bug幾乎是不可避免的。其實大部分程序員花了大量的時間進行Debug(調(diào)試),以使他們的代碼沒有Bug。?

創(chuàng)新互聯(lián)建站的客戶來自各行各業(yè),為了共同目標,我們在工作上密切配合,從創(chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對我們的要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。專業(yè)領域包括成都網(wǎng)站制作、成都網(wǎng)站建設、電商網(wǎng)站開發(fā)、微信營銷、系統(tǒng)平臺開發(fā)。
在調(diào)試時,最常用的方法無疑是選擇使用print()語句來了解 pipeline 流程以及發(fā)現(xiàn)bug。
然而,使用print()有許多注意事項,例如:
- 打印語句通常是為了向用戶顯示一個輸出。如果程序員使用print()?進行調(diào)試,在調(diào)試結束后,程序員應該謹慎地只刪除那些特定的print()語句,這些語句是用來調(diào)試的。
- 通常,在調(diào)試期間,你可能會一個接一個地打印多個變量。在這種情況下,程序員必須手動格式化輸出以增強其可讀性。
var_1 = 1
var_2 = 2
print(var_1)
print(var_2)
1
2
上面,我們打印了兩個變量。雖然在這里我們知道第一個變量是var_1?,第二個是var_2,但隨著變量數(shù)量的增加,可能需要你在代碼和輸出之間來回尋找,以找出哪個輸出對應于哪個變量。
當然,我們可以打印更多的細節(jié),像下面這樣,但這只是增加了你的工作,如果我們一直在做像這樣的工作,不就需要996了。
var_1 = 1
var_2 = 2
print("var_1 =", var_1)
print("var_2 =", var_2)
var_1 = 1
var_2 = 2
- 有時,程序員可能還需要對打印行號、函數(shù)名稱及其輸入等,這增加了編寫又長、又多的print()語句的復雜性。
- 在大多數(shù)情況下,代碼庫不只限于一個文件。相反,有多個文件組成管道。在這種情況下,人們可能有興趣在調(diào)試時也顯示文件的名稱,而用print()會很麻煩。
上述原因使得print()(至少對我來說)成為最糟糕的調(diào)試選項。
值得慶幸的是,在Python中有一個很好的替代方案 —— IceCream[1] !
IceCream
IceCream是一個Python庫,它使Debug不費吹灰之力,并能用最少的代碼查看調(diào)試結果。
它常用的功能包括打印表達式、變量名、函數(shù)名、行號、文件名等等。
安裝 IceCream
你可以使用 pip?來安裝 icecream庫。
pip install icecream
導入IceCream
使用這個庫的標準慣例是導入ic模塊,如下所示。
from icecream import ic
開始使用IceCream
使用 IceCream 庫就像 print 語句一樣簡單。你需要把 print()? 替換為 ic()。就是這樣。
ic(var_1)
ic(var_2)
ic| var_1: 1
ic| var_2: 2
注意區(qū)別!ic()不僅打印值,而且還打印所傳遞的變量的名稱。
IceCream 不僅僅局限于一個變量。相反,你可以在函數(shù)、類等方面使用它。
def func(num):
return num * 2
ic(func(3))
ic| func(3): 6
超酷!它打印了方法的名稱(func?),傳遞的參數(shù)(3?)和輸出(6)。
每一個進入ic()?方法的表達式?都會被打印出來,同時還有表達式的數(shù)值,如下圖所示。
Icecream同時打印表達式和它的值
用 IceCream Debug 也可以應用于普通的 Python 數(shù)據(jù)結構。下面是一個Python字典的例子。
sample_dict = {1:"A", 2:"B", 3:"C"}
ic(sample_dict[1])ic| sample_dict[1]: 'A'
檢查執(zhí)行情況
很多時候,程序員使用print()來顯示有意義的(有時是隨機的)語句來確定程序的流程。
def func(input_num):
if input_num == 1:
print("If Executed!")
...
else:
print("Else Executed!")
...
IceCream也可以避免那些奇怪的聲明。
## icecream_demo.py
from icecream import ic
def func(input_num):
if input_num == 1:
ic()
...
else:
ic()
...
func(2)
只要調(diào)用ic()就可以了。它將打印文件名、行號和其他細節(jié)(如函數(shù)名,如果有的話)以及時間。這樣看,是不是非常簡單。
使用IceCream項目范圍
接下來,你可能會想,print() 函數(shù)是Python 的內(nèi)置庫,使用方便,不需每次都import。而我們的IceCream 是否需要在每個Python文件中都導入這個庫?當然不是!
為了使方法在所有項目文件中可用,在根文件中導入icecream的install模塊,如下所示。
## main_file.py
from icecream import install
install()
from help_file import func
func(2)
## help_file.py
def func(num):
ic(num)
return 2*num
通過install,ic()可以在整個項目中使用。
添加一個自定義前綴
如果你注意到上面,ic()?語句的輸出以"ic|"開始。那是IceCream提供的默認前綴。
然而,如果由于某種原因,你希望用一個自定義的前綴來代替它,我們可以通過在 ic.configureOutput()? 方法中指定 prefix 參數(shù)來實現(xiàn)的,如下所示。
from icecream import ic
ic.configureOutput(prefix='ic debug| -> ')
ic("A custom prefix")
調(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
標題名稱:不再使用Print來Debug了,IceCream來了!
網(wǎng)頁路徑:http://www.dlmjj.cn/article/dpsesdg.html


咨詢
建站咨詢
