Linux中國

使用這個開源工具來監控 Python 中的變數

在調試代碼時,你經常面臨著要弄清楚一個變數何時發生變化。如果沒有任何高級工具,那麼可以選擇使用列印語句在期望它們更改時輸出變數。然而,這是一種非常低效的方法,因為變數可能在很多地方發生變化,並且不斷地將其列印到終端上會產生很大的干擾,而將它們列印到日誌文件中則變得很麻煩。

這是一個常見的問題,但現在有一個簡單而強大的工具可以幫助你監控變數:watchpoints

「監視點」的概念在 C 和 C++ 調試器中很常見,用於監控內存,但在 Python 中缺乏相應的工具。watchpoints 填補了這個空白。

安裝

要使用它,你必須先用 pip 安裝它:

$ python3 -m pip install watchpoints

Python中使用 watchpoints

對於任何一個你想監控的變數,使用 watch 函數對其進行監控。

from watchpoints import watch

a = 0
watch(a)
a = 1

當變數發生變化時,它的值就會被列印到標準輸出

====== Watchpoints Triggered ======

Call Stack (most recent call last):
  <module> (my_script.py:5):
> a = 1
a:
0
->
1

信息包括:

  • 變數被改變的行。
  • 調用棧。
  • 變數的先前值/當前值。

它不僅適用於變數本身,也適用於對象的變化:

from watchpoints import watch

a = []
watch(a)
a = {} # 觸發
a["a"] = 2 # 觸發

當變數 a 被重新分配時,回調會被觸發,同時當分配給 a 的對象發生變化時也會被觸發。

更有趣的是,監控不受作用域的限制。你可以在任何地方觀察變數/對象,而且無論程序在執行什麼函數,回調都會被觸發。

from watchpoints import watch

def func(var):
    var["a"] = 1

a = {}
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"] = 1
a:
{}
->
{&apos;a&apos;: 1}

watch 函數不僅可以監視一個變數,它也可以監視一個字典或列表的屬性和元素。

from watchpoints import watch

class MyObj:
    def __init__(self):
        self.a = 0

obj = 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 許可下發布了它。安裝並使用它,當然也歡迎大家做出貢獻。

via: https://opensource.com/article/21/4/monitor-debug-python

作者:Tian Gao 選題:lujun9972 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國