關於程式碼除錯的技巧,我之前寫過很多的文章,加起來也有 將近 10 篇了,關注比較早的同學,也應該都有看過。
其中有一篇是關於 pdb 的除錯技巧的:使用 pdb 進行無介面除錯
裡面介紹了兩種 pdb 的除錯入口,也是大部分所熟知的。
這裡再帶大家回顧一下
第一種:指定 -m pdb 來開啟
$ python -m pdb pdb_demo.py
第二種:使用 pdb.set_trace() 在程式碼中設定斷點
import pdbpdb.set_trace()
但其實,pdb 還另外兩種除錯方法,第一種方法,可能有 99% 的開發者都沒用過,甚至連見過都沒有。
這兩種方法,是配合 Python Console 的互動介面來實現的。
首先我準備好一個名為 utils.py 的 Python檔案,裡面定義了一個 sum 的工具函式(僅作演示用)。
def sum(*args): result = 0 for arg in args: result += arg return result
然後在終端敲入 Python 進入 Console 的模式,匯入這個模組,並呼叫 sum 函式,在正常情況下,函式可以正常工作。
>>> import utils>>> utils.sum(1,2,3)6
但如果你的引數型別轉成了 str,函式就會報錯啦~
>>> utils.sum(1,2,"3")Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/MING/utils.py", line 4, in sum result += argTypeError: unsupported operand type(s) for +=: 'int' and 'str'
由於這裡的報錯是我刻意觸發的,從報錯來看,是很容易定位的。
但是在實際應用中,難免會遇到一些無法從報錯資訊直接判斷 bug 所在的情況。
這個時候,如果可以在報錯後,切換到 pdb 的除錯模式就好了~
事實上,pdb 是支援這種用法的。
只要你在當前的會話中,匯入 pdb,再執行 pdb.pm(),就可以切換到熟悉的 pdb 除錯介面,並在跑錯的地方打上斷點,然後你就可以任意地檢視執行時的變數資訊。
如果你不是想等報錯了再除錯,而是一開始就想進入除錯模式,可以使用 pdb.runcall() 函式
有的同學可能還會想到 pdb.run() 和 pdb.runeval() 這兩個函式,但這兩種方法,是需要提前在函式除錯斷點的,這就比較麻煩了,一般情況下不推薦使用。
綜上所述, pdb 除錯方法主要有六種:
python -m pdb:執行 python 檔案時直接進入除錯模式pdb.set_trace():事先設定斷點,然後直接執行 python 檔案pdb.run():事先設定斷點,然後直接執行 python 模組pdb.runeval():事先設定斷點,然後直接執行 python 模組(與 pdb.run 類似)pdb.pm():在 Console 模式下出錯後直接切換到除錯模式,並定位到報錯位置。pdb.runcall():可以在不設定斷點的情況下,直接除錯程式碼片段。其中,pdb.pm() 是本文的重點,他雖然冷門,但卻很好用,推薦給大家。