溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用Watchpoints來(lái)監(jiān)控Python 中的變量

發(fā)布時(shí)間:2021-10-09 17:06:43 來(lái)源:億速云 閱讀:370 作者:柒染 欄目:互聯(lián)網(wǎng)科技

如何使用Watchpoints來(lái)監(jiān)控Python 中的變量,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

Watchpoints 是一個(gè)簡(jiǎn)單但功能強(qiáng)大的工具,可以幫助你在調(diào)試 Python 時(shí)監(jiān)控變量。

在調(diào)試代碼時(shí),你經(jīng)常面臨著要弄清楚一個(gè)變量何時(shí)發(fā)生變化。如果沒(méi)有任何高級(jí)工具,那么可以選擇使用打印語(yǔ)句在期望它們更改時(shí)輸出變量。然而,這是一種非常低效的方法,因?yàn)樽兞靠赡茉诤芏嗟胤桨l(fā)生變化,并且不斷地將其打印到終端上會(huì)產(chǎn)生很大的干擾,而將它們打印到日志文件中則變得很麻煩。

這是一個(gè)常見(jiàn)的問(wèn)題,但現(xiàn)在有一個(gè)簡(jiǎn)單而強(qiáng)大的工具可以幫助你監(jiān)控變量:watchpoints。

“監(jiān)視點(diǎn)”的概念在 C 和 C++ 調(diào)試器中很常見(jiàn),用于監(jiān)控內(nèi)存,但在 Python 中缺乏相應(yīng)的工具。watchpoints 填補(bǔ)了這個(gè)空白。

安裝

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

$ python3 -m pip install watchpoints

在Python中使用 watchpoints

對(duì)于任何一個(gè)你想監(jiān)控的變量,使用 watch 函數(shù)對(duì)其進(jìn)行監(jiān)控。

from watchpoints import watch a = 0watch(a)a = 1

當(dāng)變量發(fā)生變化時(shí),它的值就會(huì)被打印到標(biāo)準(zhǔn)輸出

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

信息包括:

  • 變量被改變的行。

  • 調(diào)用棧。

  • 變量的先前值/當(dāng)前值。

它不僅適用于變量本身,也適用于對(duì)象的變化:

from watchpoints import watch a = []watch(a)a = {} # 觸發(fā)a["a"] = 2 # 觸發(fā)

當(dāng)變量 a 被重新分配時(shí),回調(diào)會(huì)被觸發(fā),同時(shí)當(dāng)分配給 a 的對(duì)象發(fā)生變化時(shí)也會(huì)被觸發(fā)。

更有趣的是,監(jiān)控不受作用域的限制。你可以在任何地方觀察變量/對(duì)象,而且無(wú)論程序在執(zhí)行什么函數(shù),回調(diào)都會(huì)被觸發(fā)。

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

watch 函數(shù)不僅可以監(jiān)視一個(gè)變量,它也可以監(jiān)視一個(gè)字典或列表的屬性和元素。

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 # 觸發(fā)d["a"] = 1 # 觸發(fā)

這可以幫助你縮小到一些你感興趣的特定對(duì)象。

如果你對(duì)輸出格式不滿意,你可以自定義它。只需定義你自己的回調(diào)函數(shù):

watch(a, callback=my_callback) # 或者全局設(shè)置 watch.config(callback=my_callback)

當(dāng)觸發(fā)時(shí),你甚至可以使用 pdb

watch.config(pdb=True)

這與 breakpoint() 的行為類似,會(huì)給你帶來(lái)類似調(diào)試器的體驗(yàn)。

如果你不想在每個(gè)文件中都導(dǎo)入這個(gè)函數(shù),你可以通過(guò) install 函數(shù)使其成為全局:

watch.install() # 或 watch.install("func_name") ,然后以 func_name() 方式使用

我個(gè)人認(rèn)為,watchpoints 最酷的地方就是使用直觀。你對(duì)一些數(shù)據(jù)感興趣嗎?只要“觀察”它,你就會(huì)知道你的變量何時(shí)發(fā)生變化。

嘗試 watchpoints

我在 GitHub 上開(kāi)發(fā)維護(hù)了 watchpoints,并在 Apache 2.0 許可下發(fā)布了它,安裝并使用它。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI