目錄

  • 前言
  • 基礎使用方法
  • 進階使用方法
    • 停用除錯
    • 第三方模組

前言

很多攻城獅不喜歡除錯,特別是在趕進度時,你只是希望某個功能跑得動...但是在某些狀況下,除錯器是必需品,透過中斷點、追蹤變數,你可能會發現新世界(原來這 code 是這樣跑阿)。

和其他語言比起來,Python 在除錯上不太方便:

  1. 你要寫 import pdb; pdb.set_trace() 來設立中斷點,當你寫了 100 次的時候會變成肌肉記憶,不過對於新的開發者來說就不是如此了。
  2. PDB 不是唯一的 Debugger,除了最基本的 PDB 以外還有超級多的選擇。
  3. 如果你不是在寫一個 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();

參考資料

系列介紹