優秀開發者必備技能包:Python偵錯程式

AI科技大本營發表於2019-02-25

640?wx_fmt=jpeg

 

作者 | Roky0429

來源  | Python空間(ID:Devtogether)

 

人工智慧的現狀及今後發展趨勢如何? 

https://edu.csdn.net/topic/ai30?utm_source=csdn_bw

 

 

寫在之前

 

不管是之前搞 acm 用 c/c++ 寫演算法還是後來用 Python 寫程式碼,我發現在程式出現問題的時候,大多數人習慣性的用 print 函式列印變數值這種方法來試圖找出問題的癥結所在,這種查詢問題的方式低效到讓人只想刪掉程式碼重新去寫。我記得一些人問我問題的時候,我不止一次的推薦過讓他們用單步除錯去找程式碼中存在的問題,但是更多收穫的是「什麼是單步除錯」這種疑問,其實單步除錯就是,自己去 Google 好麼?

 

究其源頭還是很多人沒有意識到「除錯程式」的重要性,或者根本不知道這個概念。除錯程式是所有開發人員必須具備的一項重要技能,它可以讓我們一步一步的看到程式的執行過程,幫助我們準確的找到程式中的錯誤。當然這裡我們還是以 Python 為例來說「除錯程式」。

 

也許會有人說我現在就寫一些短的程式碼,好像也不用這麼麻煩的去除錯程式。如果你只是準備寫一輩子短程式碼,那你確實不用,但是如果你以後一步步的想去做專案了,隨著程式碼量的增加,邏輯的複雜,如果你還是硬撐著用 print 去解決問題,那麼恭喜你,你可能加班加到頭髮光光也不一定能找到問題在哪。所以我希望大家能在一開始就走在正確的道路上,只要稍微花點時間去學習就能掌握的技能為什麼要當作視而不見呢?植髮很貴的!

 

現在很多的編輯器其實都帶著「除錯程式」的功能,比如寫 c/c++ 的 codeblocks,寫 Python 的 pycharm,這種圖形介面的使用和顯示都相當友好,簡單方便易學,這個不是我這篇文章要講的重點。今天主要是想給大家介紹一下 「Python偵錯程式」,快速定位各種疑難雜症。

 

Python 偵錯程式

 

這一部分主要就是想說兩個 Python 偵錯程式,分別是標準庫自帶的 pdb 和開源的 ipdb。

 

pdb

 

pdb 是 Python 自帶的庫,為 Python 提供了一種互動式的原始碼除錯功能,包含當前偵錯程式應有的功能,包括設定斷點、單步除錯、檢視原始碼等。其實如果你之前學過 c/c++ 的話,你可能知道 gdb 這個命令列除錯工具,如果你之前用過 gdb,那麼恭喜你你可以直接用 pdb 了,因為這哥倆一個用法。如果你不知道 gdb 也沒事,我們先來看一下 pdb 的部分除錯命令(截圖來自指令碼之家):

 

640?

 

這裡有兩種不同的方法來啟動 Python 偵錯程式,兩種方法適用於不同的場景。一種是直接在命令列引數指定使用 pdb 模組啟動 Python 檔案,這種適合於程式碼檔案較短的情況,將在程式碼的第一行啟動 Python 偵錯程式。具體如下所示(例如檔名是 test.py):

 


 

python -m pdb test.py

 

 

另一種是在 Python 程式碼中呼叫 pdb 模組的 set_trace 方法設定一個斷點,當程式執行到此斷點的時候,程式將會暫停執行並且開啟 pdb 偵錯程式,這種適合於程式碼檔案較大的情況。具體如下所示:

 


 

import pdb

def get_sum(n):
   cnt = 0
   for i in range(n):
       pdb.set_trace()
       cnt += i
       print(cnt)

if __name__ == '__main__':
   get_sum(5)

 

 

啟動 Python 偵錯程式以後就可以使用上面截圖中的除錯命令進行程式的除錯。比如在接下來的操作中,我們先使用 list 來檢視我們的程式碼,然後使用 p 列印變數當前的取值,最後用 n 執行下一行 Python 程式碼:

 

640?

 

ipdb

 

ipdb 是一個開源的 Python 偵錯程式,其實它和 pdb 的介面是一樣的。那既然一樣的介面,那為啥還要設計個 ipdb 呢?黑格爾曾經說過「存在即合理」,ipdb 相比於 pdb 多了語法高亮,tab 自動補全等友好功能,在易用性方面做了很大的改進,這個感覺就和 Python 和 IPython 一樣。

 

當然,ipdb 作為一個第三方庫,在使用之前必然要先安裝:

 


 

pip install ipdb

 

 

我們修改一下之前例子中的 test.py 檔案,修改之後的程式碼如下:

 


 

import ipdb

def get_sum(n):
   cnt = 0
   for i in range(n):
       ipdb.set_trace()
       cnt += i
       print(cnt)

if __name__ == '__main__':
   get_sum(5)

 

 

具體的操作還是和上面的 pdb 的操作一樣:

 

640?

 

你看,上面帶了點兒高亮,是不是順眼了很多?還不趕緊去試試。

 

(本文為AI科技大本營轉載文章,轉載請聯絡原作者)

60s測試:你是否適合轉型人工智慧?

https://edu.csdn.net/topic/ai30?utm_source=cxrs_bw

 

 

群招募

 

掃碼新增小助手微信,回覆:公司+研究方向(學校+研究方向),邀你加入技術交流群。技術群稽核較嚴,敬請諒解。

640?wx_fmt=jpeg

推薦閱讀:

                         640?wx_fmt=png

點選“閱讀原文”,檢視歷史精彩文章。

相關文章