附錄B 更多IPython系統(tǒng)相關(guān)內(nèi)容
B.3 軟件開發(fā)工具
?????? 除了為交互式計(jì)算和數(shù)據(jù)探索提供舒適的環(huán)境外,IPython還可以成為通用Python軟件開發(fā)的伴侶。在數(shù)據(jù)分析應(yīng)用程序中铐伴,首先,代碼的正確性非常重要。幸運(yùn)的是续扔, IPython緊密集成并增強(qiáng)了內(nèi)置的Python pdb調(diào)試器。其次焕数,你希望你的代碼更快纱昧。為此,IPython擁有易于使用的代碼測時(shí)和分析工具堡赔。我將在這里詳細(xì)介紹這些工具识脆。
B.3.1 交互式調(diào)試器
??????? IPython的調(diào)試器對(duì)pdb進(jìn)行了加強(qiáng),加強(qiáng)的地方包括tab鍵補(bǔ)全、語法高亮以及異炒媪В回溯中每一行的上下文仑荐。調(diào)試代碼的最佳時(shí)機(jī)之一就是在發(fā)生錯(cuò)誤之后。在異常發(fā)生后立刻輸入%debug命令纵东,可以喚起"后現(xiàn)代"調(diào)試器并讓你進(jìn)入拋出異常的堆棧區(qū)(見圖1)
??????? 一旦進(jìn)入調(diào)試器粘招,你就可以執(zhí)行任意Python代碼,并探索每個(gè)堆棧區(qū)內(nèi)的所有對(duì)象和數(shù)據(jù)(數(shù)據(jù)由解釋器“保持活動(dòng)狀態(tài)”)偎球。默認(rèn)情況下洒扎,你從最底層開始,那里是錯(cuò)誤發(fā)生的地方衰絮。通過按u(上)和d(下)袍冷,你可以在堆棧回溯的不同層級(jí)間切換(見圖2)
?????? 執(zhí)行% pdb命令可以使IPython在任何異常之后自動(dòng)調(diào)用調(diào)試器猫牡,許多用戶認(rèn)為這個(gè)命令特別有用胡诗。
?????? 使用調(diào)試器來幫助開發(fā)代碼也很容易,特別是當(dāng)你希望設(shè)置斷點(diǎn)或單步執(zhí)行函數(shù)或腳本來檢查每個(gè)階段的狀態(tài)時(shí)淌友。有多種方式可以實(shí)現(xiàn)這個(gè)功能煌恢。第一種方式是使用%run命令和-d標(biāo)志,這種方式在執(zhí)行所有傳遞的腳本中的代碼前喚起調(diào)試器震庭。你必須立刻按下s(step)來進(jìn)入腳本瑰抵。
?????? 在這之后,如何處理文件將取決于你自己器联。例如二汛,在之前的異常中,我們可以在調(diào)用works_fine方法前設(shè)置一個(gè)斷點(diǎn)拨拓,然后我們按下c(continue肴颊,繼續(xù))運(yùn)行程序直到我們達(dá)到斷點(diǎn)處。(見圖3)
??????? 這時(shí)候千元,可以step(單步)進(jìn)入works_fine()或按下n(next苫昌,下一行)執(zhí)行works_fine()并進(jìn)行到下一行(見圖4)
?????? 然后我們進(jìn)入throws_an_exception,再進(jìn)入到錯(cuò)誤發(fā)生的行檢查范圍內(nèi)的變量幸海。請(qǐng)注意祟身,調(diào)試器命令優(yōu)先于變量名稱。在這種情況下物独,變量前面加上袜硫!來檢查變量的內(nèi)容(見圖5)
?????? 對(duì)交互式調(diào)試器的熟練程度在很大程度上取決于實(shí)踐和經(jīng)驗(yàn)。有關(guān)調(diào)試器命令的完整目錄挡篓,請(qǐng)參見表B-2婉陷。如果你習(xí)慣于使用IDE帚称,那么您可能會(huì)發(fā)現(xiàn)終端驅(qū)動(dòng)的調(diào)試器起初有點(diǎn)不習(xí)慣,但這會(huì)隨著時(shí)間的推移而改進(jìn)秽澳。一些Python IDE具有出色的GUI調(diào)試器闯睹,所以大多數(shù)用戶可以找到適合他們的東西。
B.3.1.1 調(diào)試器的其他用途
?????? 有幾個(gè)其他有用的方法來調(diào)用調(diào)試器担神。第一種方法是使用一個(gè)特殊的set_trace函數(shù)(以pdb.set_trace命名)楼吃,該函數(shù)基本上是一個(gè)“窮人的斷點(diǎn)”。這里有兩個(gè)小技巧妄讯,你可能希望將這些技巧放在某處用于常規(guī)使用(也可以像我這樣將它們添加到IPython配置文件中):
?????? 第一個(gè)函數(shù)set_trace是非常簡單的孩锡。你可以在代碼的任何部分使用set_trace來臨時(shí)停止,以便更仔細(xì)地檢查代碼(例如在異常發(fā)生前):
?????? 按c(continue亥贸,繼續(xù))將導(dǎo)致代碼恢復(fù)正常躬窜,不會(huì)造成任何損害。
?????? 我們剛剛查看的debug函數(shù)允許你在任意函數(shù)調(diào)用中輕松喚起交互式調(diào)試器炕置。假設(shè)我們已經(jīng)寫了如下的函數(shù)荣挨,并且我們希望單步運(yùn)行通過它的邏輯:
?????? 調(diào)試器可以與% run結(jié)合使用。通過使用% run-d運(yùn)行腳本讹俊,你將直接進(jìn)入到調(diào)試器中垦沉,隨時(shí)可以設(shè)置任何斷點(diǎn)并啟動(dòng)腳本:
??????? 用行號(hào)加上-b會(huì)啟動(dòng)一個(gè)已經(jīng)設(shè)置了斷點(diǎn)的調(diào)試器: