使用這個開源工具來監控 Python 中的變量
Watchpoints 是一個簡單但功能強大的工具,可以幫助你在調試 Python 時監控變量。
在調試代碼時,你經常面臨著要弄清楚一個變量何時發生變化。如果沒有任何高級工具,那么可以選擇使用打印語句在期望它們更改時輸出變量。然而,這是一種非常低效的方法,因為變量可能在很多地方發生變化,并且不斷地將其打印到終端上會產生很大的干擾,而將它們打印到日志文件中則變得很麻煩。
這是一個常見的問題,但現在有一個簡單而強大的工具可以幫助你監控變量:watchpoints。
“監視點”的概念在 C 和 C++ 調試器中很常見,用于監控內存,但在 Python 中缺乏相應的工具。watchpoints 填補了這個空白。
安裝
要使用它,你必須先用 pip 安裝它:
$ python3 -m pip install watchpoints
在Python中使用 watchpoints
對于任何一個你想監控的變量,使用 watch 函數對其進行監控。
from watchpoints import watcha = 0watch(a)a = 1
當變量發生變化時,它的值就會被打印到標準輸出:
====== Watchpoints Triggered ======Call Stack (most recent call last):<module> (my_script.py:5):> a = 1a:0->1
信息包括:
- 變量被改變的行。
- 調用棧。
- 變量的先前值/當前值。
它不僅適用于變量本身,也適用于對象的變化:
from watchpoints import watcha = []watch(a)a = {} # 觸發a["a"] = 2 # 觸發
當變量 a 被重新分配時,回調會被觸發,同時當分配給 a 的對象發生變化時也會被觸發。
更有趣的是,監控不受作用域的限制。你可以在任何地方觀察變量/對象,而且無論程序在執行什么函數,回調都會被觸發。
from watchpoints import watchdef func(var):var["a"] = 1a = {}watch(a)func(a)
例如,這段代碼打印出:
====== Watchpoints Triggered ======Call Stack (most recent call last):<module> (my_script.py:8):> func(a)func (my_script.py:4):> var["a"] = 1a:{}->{'a': 1}
watch 函數不僅可以監視一個變量,它也可以監視一個字典或列表的屬性和元素。
from watchpoints import watchclass MyObj:def __init__(self):self.a = 0obj = MyObj()d = {"a": 0}watch(obj.a, d["a"]) # 是的,你可以這樣做obj.a = 1 # 觸發d["a"] = 1 # 觸發
這可以幫助你縮小到一些你感興趣的特定對象。
如果你對輸出格式不滿意,你可以自定義它。只需定義你自己的回調函數:
watch(a, callback=my_callback)# 或者全局設置watch.config(callback=my_callback)
當觸發時,你甚至可以使用 pdb:
watch.config(pdb=True)
這與 breakpoint() 的行為類似,會給你帶來類似調試器的體驗。
如果你不想在每個文件中都導入這個函數,你可以通過 install 函數使其成為全局:
watch.install() # 或 watch.install("func_name") ,然后以 func_name() 方式使用
我個人認為,watchpoints 最酷的地方就是使用直觀。你對一些數據感興趣嗎?只要“觀察”它,你就會知道你的變量何時發生變化。
嘗試 watchpoints
我在 GitHub 上開發維護了 watchpoints,并在 Apache 2.0 許可下發布了它。安裝并使用它,當然也歡迎大家做出貢獻。



























