如何調試您的Python代碼?
譯文【51CTO.com快譯】對于碼農而言,如果說能夠編寫出有效的代碼,會給他們帶來滿滿的成就感的話;那么當其代碼中出現(xiàn)缺陷、甚至是錯誤時,他們則會產生深深的挫敗感。因此,為了避免在軟件運行的過程中,出現(xiàn)各種意想不到的錯誤,我們需要通過針對程序的調試,來消除各種代碼級別的錯誤。本文將以Python為例,和您討論八種有關代碼調試的優(yōu)秀實踐。
何為Python異常?
每當Python無法解釋某段目標代碼或命令時,程序往往會拋出異常。Python的各種異常,實際上是Python在執(zhí)行代碼時,出現(xiàn)的一組錯誤集合。
通常,Python會使用try和except塊,來觸發(fā)各種錯誤異常。由于可執(zhí)行的命令往往位于try塊之內,因此當try中的代碼出現(xiàn)失敗時,Python就會去執(zhí)行except塊中的代碼。也就是說,except關鍵字中的語句本質上就是try塊中的那些異常,Python只是將它們作為錯誤而觸發(fā)罷了。當然,一個try...except塊有時候也可能會包含多個帶有except關鍵字的異常。其中包含了許多我們在Python中常見的典型錯誤與詳細信息。
由于我們在使用各種內置函數(shù)、軟件庫或Python框架時,都可能會碰到異常,因此,即便您認真編寫和遵守了正確的語法,也無法保證相關方法在調用和執(zhí)行時不會出錯。例如,您可能只編寫了大約5行代碼,但是Python程序會發(fā)現(xiàn)到您正在使用的某個庫、框架或內置方法的源代碼中,存在著預定義的相關異常,因此會在第200行處觸發(fā)異常錯誤。
語法錯誤
當程序代碼無法在語法層面上被識別時,Python通常會拋出語法級別的錯誤。如果您是Python的初學者,那么就可能會頻繁地遇到此類語法錯誤。不過,由于這些錯誤比那些深層次的異常(in-depth exceptions)更易于被追溯,因此您一旦掌握了基本原理,就很容易對它們進行合理的處理。
如何調試你的Python代碼
Python的典型異常包括:縮進、類型、以及名稱錯誤等方面。它們既可能來自單行代碼,也可能源于某個代碼塊。我們雖然沒有統(tǒng)一的方法對其進行處置,但是可以根據各種實例和項目類型,去予以應對。下面,讓我們來具體討論可用于調試Python的八種方法。它們既可以被單獨使用,也能夠通過組合來增強效果。
1.檢查錯誤描述
處理Python錯誤的可用方法之一是查看錯誤的描述。Python通常會在其錯誤輸出的最后一行給予詳細的說明。例如:在解析意外的EOF(End Of File)時,我們會發(fā)現(xiàn)它們通常與缺少括號有關。也就是說,當您嘗試著從類或對象處調用某個錯誤的函數(shù)時,就會出現(xiàn)AttributeError之類無效的語法(invalid syntax)錯誤。因此,通過最終一行的“蛛絲馬跡”,您往往能夠成功地追蹤錯誤的來源,并著手重寫其相關的代碼。
2.追蹤錯誤的來源
Python的錯誤具有較強的代碼行限定性(line-bound),在遇到錯誤時,您需要注意Python所指向的具體行號。例如,由于下面的代碼會嘗試著連接不同的數(shù)據類型(字符串和整數(shù)),因此會產生類型方面的錯誤(type error)。其錯誤信息指向了示例代碼中的第2行:
示例代碼:
- db = open("output.txt", "a")
- a = "Hello"+1
- b = "How do you do?"
- db.write(a+", "+b+"
- ")
錯誤信息:
- raceback (most recent call last):
- File "C:\Users\Omisola Idowu\Desktop\Lato
- oup
- ew.py", line 2, in
- a = "Hello"+1
- TypeError: can only concatenate str (not "int") to str
下面讓我們再來看另一個錯誤示例:
代碼:
- def findTotal(a):
- for i in a
- print(sum(i)*2)
錯誤信息:
- File "C:\Users\Omisola Idowu\Desktop\Lato
- oup
- ew.py", line 2
- for i in a
- ^
- SyntaxError: invalid syntax
顯然,Python指出了第2行的語法錯誤。如果您熟悉Python的話,就能夠一眼看出:實際上,這是因為在for循環(huán)后面缺少的一個冒號。
3.在命令行上利用Trace方法
雖然您可以使用內置的集成開發(fā)和學習環(huán)境(Integrated Development and Learning Environment,IDLE)去調試Python,但是它不一定適合大型的軟件項目。因此,調試Python的可用方法之一實際上是采用命令行界面(command-line interface,CLI)。它與在JavaScript中運行console.log()有著相似的效果。
如果您在代碼執(zhí)行過程中遇到了錯誤,則可以啟動CLI,并使用trace命令去試著運行有問題的腳本。其基本工作原理是對代碼進行逐行檢查,并對發(fā)現(xiàn)問題的地方予以解析。
若要調用該方法,請在命令行中,以如下方式運行代碼文件:
- python -m trace --trace file_name.py
在大型項目中,雖然以上述方式運行整個腳本并不切實際,但是您可以創(chuàng)建一個單獨的Python文件,將每個代碼塊(一次僅一段)逐個粘貼到該文件中,然后分別運行上述命令。在此,您可以將其視為單元性調試的一種特有形式。
4.測試您的代碼
除了上述提到的異常原因之外,錯誤的布爾值(boolean)有時也會導致您的程序在部署中表現(xiàn)異常或出現(xiàn)錯誤。單元測試往往涉及到需要隔離代碼中的某些單元(塊或行),以測試具體的性能、效率、以及正確性等指標。它們對于程序代碼而言都是極其重要的。在單元測試中,我們可以使用多種調試技術,來通過assert函數(shù)對代碼的正確性進行分析,以及檢查代碼在運行過程中所需的時間等維度指標。
在實際生產環(huán)境中,我們可以創(chuàng)建一個名為test.py的單獨Python文件,并在該文件中測試每個代碼單元。如下代碼段展示了單元測試的一個示例:
- data = {
- "guitars":[
- {"Seagull":"$260"},
- {"Fender":"$700"},
- {"Electric-acoustic":"$600"}
- ]
- }
- if len(data["guitars"])==2:
- for i in data["guitars"]:
- print(i)
- assert len(data["guitars"])==2, "Length less than what's required, should be 3"
可見,由于數(shù)組的長度小于3,因此Python會觸發(fā)如下斷言錯誤:
- AssertionError: Length less than what's required, should be 3
5.使用日志
作為調試代碼的另一種方法,Python內置了一套日志庫,可供日志的檢查與勘誤。您可以通過鏈接--https://docs.python.org/3/howto/logging.html,來進一步了解其工作原理,以及如何在控制臺中的運行和捕獲它們。如果您覺得在部署應用的過程中,無法通過控制臺來查看到日志,則可以通過設置簡單郵件傳輸協(xié)議(SMTP),以便于將代碼日志以電子郵件的方式及時捕獲與分析。
6.使用標準的Python調試器
Python有一個被稱為pdb的、非常流行的板載調試器。由于它是內置的,因此您只需要將pdb導入待測試文件中即可。pdb模塊可以通過對代碼采取事后執(zhí)行(post-mortem)的方式,來調試程序在運行過程中出現(xiàn)的突然崩潰現(xiàn)象。
您既可以將pdb用于運行整個Python文件,也可以僅執(zhí)行某個單元,以深入到程序的每一行去發(fā)現(xiàn)潛在的錯誤。在實際使用中,您需要首先打開Python文件,然后通過importpdb;pdb.set_trace(),來啟動pdb調試器。接著,您可以通過CLI運行待測試的Python文件(請參見--https://www.makeuseof.com/run-python-script/):
- Python Your_Python_file.py
通過如下帶有h的命令,您可以查看到pdb的所有可用命令列表:
- (pdb) h
列表的輸出如下圖所示:
例如,您可以通過如下命令,來逐行羅列出代碼:
- (pdb) l
7.使用IDE進行調試
IDE也是用于調試Python腳本的寶貴工具。其中:
- Visual Studio Code(https://code.visualstudio.com/download)能夠協(xié)助您運行與調試Python程序中的各項功能。
- 作為一種語言類支持插件,Pylance可允許您在調試的模式下運行自己的代碼。
- 作為另一個出色的IDE,Pycharm(https://www.jetbrains.com/pycharm/download/)可以幫助您更加深入地查找代碼中的錯誤。
- Eclipse(http://www.eclipse.org/downloads/packages/)也提供了一個名為Pydev的第三方插件,以實現(xiàn)針對Python腳本的輕松調試。
8.在網上搜索解決方案
鑒于Python具有龐大的開發(fā)者社區(qū),您不妨將互聯(lián)網作為尋找解決Python代碼問題的可靠資源。例如,Stackoverflow(https://stackoverflow.com/)便是一個流行的代碼社區(qū),您可以在其中進行各種互動式的問答。當然,YouTube上也包含了大量的有關Python編程的實用視頻。
原文標題:How to Debug Your Python Code,作者:IDOWU OMISOLA
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】