目錄
- 前言
- 基礎使用方法
- 進階使用方法
- 停用除錯
- 第三方模組
前言
很多攻城獅不喜歡除錯,特別是在趕進度時,你只是希望某個功能跑得動...但是在某些狀況下,除錯器是必需品,透過中斷點、追蹤變數,你可能會發現新世界(原來這 code 是這樣跑阿)。
和其他語言比起來,Python 在除錯上不太方便:
- 你要寫
import pdb; pdb.set_trace()
來設立中斷點,當你寫了 100 次的時候會變成肌肉記憶,不過對於新的開發者來說就不是如此了。 - PDB 不是唯一的 Debugger,除了最基本的 PDB 以外還有超級多的選擇。
- 如果你不是在寫一個 console app 呢?如果中斷點在 server 端或者某個線程中呢?這時候 Debug 的 session 在哪?
Python 3.7 實現了 PEP553,增加了一種新增中斷點的方法,今天的主角—breakpoint
基礎使用方法
首先,breakpoint 是個 function ,不是 continue、break 這種關鍵字
所以你可以在 code 裡面呼叫breakpoint()
來設立中斷點,breakpoint 預設的實現方法就是import pdb
然後呼叫pdb.set_trace()
import time
print(time.ctime())
breakpoint()
print('Good morning')
接著會在終端機進入一個 pdb 的 session
這個用法直觀多了!
進階用法
PYTHONBREAKPOINT 參數
新的 breakpoint 可以在執行時設定 PYTHONBREAKPOINT 參數,執行時加入 PYTHONBREAKPOINT=value
達到一些的特別功能
暫停除錯
執行時指定 PYTHONBREAKPOINT=0
可以停止除錯執行除錯功能
第三方模組
執行時指定 PYTHONBREAKPOINT='importable.callable'
,會自動幫你載入 importable
這個套件,然後在每次呼叫 breakpoint()
時,呼叫 callable()
這個 function 來取代
如此一來,如果你想用 pudb(熱門、功能齊全的 debugger)、web-pdb(執行後可以用瀏覽器、遠端來 debug)...等這些第三方套件,就能和 breakpoint()
完美搭配。
例如:pip install web-pdb
安裝完之後,可以用
PYTHONBREAKPOINT='web_pdb.set_trace' python ex1.py
來執行
你就可以用 web-pdb 來取代原生的 pdb,而不用改任何一行 Python code,看了之後都想好好學 debug 了呢(我是很少在用的那一群,哈哈)
也可以在 Python 內,用 os 的系統變數去調整
import os
os.environ['PYTHONBREAKPOINT'] = 'web_pdb.set_trace'
# ...
breakpoint() # import web_pdb; web_pdb.set_trace();
參考資料
- Python 3.7’s new builtin breakpoint — a quick tour
https://hackernoon.com/python-3-7s-new-builtin-breakpoint-a-quick-tour-4f1aebc444c - PEP 553(Python.org)
https://www.python.org/dev/peps/pep-0553/
系列介紹
- Python 3.7特色 (0)-版本介紹
- Python 3.7特色 (0.5)-定位與特色
- Python 3.7特色 (1)-dataclass
- Python 3.7特色 (2)-breakpoint()
- Python 3.7特色 (3)-優化(time.ns、force UTF-8)
- Python 3.7特色 (4)-Cython(Thread local、pyc)(暫定)