PySnooper:不要再使用 print 來對你的 python 程式除錯

PySnooper 是一個懶人的除錯程式

你正在試圖找出為什麼 Python 程式碼沒有做你認為它應該做的事情。你可能喜歡使用帶有斷點和監視器的成熟偵錯程式,但是你現在懶得去設定一個。

你想知道哪些行在執行,哪些行沒有執行,以及區域變數的值是什麼?

大多數人會使用 print,在關鍵的位置,並顯示當下的變數值。

PySnooper 可以讓你做同樣的事情,只不過你只需要在你感興趣的函式中新增一個修飾符行(decorator line),而不是精心設計正確的 print。你將得到函式的即時日誌,包括哪些行執行、何時執行以及區域變數何時更改的確切時間。

是什麼使得 pysnoop 從所有其他程式碼智慧工具中脫穎而出?你可以在不需要做任何設定的情況下在較差的、不斷蔓延的企業程式碼庫中使用它。只需啟用 decorator,如下所示,並通過將其路徑指定為第一個引數,將輸出重定向到專用的日誌檔案。

範例

我們正在編寫一個函式,將數字轉換為二進位。讓我們通過新增@pysnooper.snoop() decorator來窺探它:

import pysnooper

@pysnooper.snoop()
def number_to_bits(number):
    if number:
        bits = []
        while number:
            number, remainder = divmod(number, 2)
            bits.insert(0, remainder)
        return bits
    else:
        return [0]

number_to_bits(6)

Stderr 的輸出為

Source path:... /my_code/foo.py
Starting var:.. number = 6
15:29:11.327032 call         4 def number_to_bits(number):
15:29:11.327032 line         5     if number:
15:29:11.327032 line         6         bits = []
New var:....... bits = []
15:29:11.327032 line         7         while number:
15:29:11.327032 line         8             number, remainder = divmod(number, 2)
New var:....... remainder = 0
Modified var:.. number = 3
15:29:11.327032 line         9             bits.insert(0, remainder)
Modified var:.. bits = [0]
15:29:11.327032 line         7         while number:
15:29:11.327032 line         8             number, remainder = divmod(number, 2)
Modified var:.. number = 1
Modified var:.. remainder = 1
15:29:11.327032 line         9             bits.insert(0, remainder)
Modified var:.. bits = [1, 0]
15:29:11.327032 line         7         while number:
15:29:11.327032 line         8             number, remainder = divmod(number, 2)
Modified var:.. number = 0
15:29:11.327032 line         9             bits.insert(0, remainder)
Modified var:.. bits = [1, 1, 0]
15:29:11.327032 line         7         while number:
15:29:11.327032 line        10         return bits
15:29:11.327032 return      10         return bits
Return value:.. [1, 1, 0]
Elapsed time: 00:00:00.000001

或者,如果你不想追蹤整個函式,你可以將相關部分包裹在一個 with block 中。

import pysnooper
import random

def foo():
    lst = []
    for i in range(10):
        lst.append(random.randrange(1, 1000))

    with pysnooper.snoop():
        lower = min(lst)
        upper = max(lst)
        mid = (lower + upper) / 2
        print(lower, mid, upper)

foo()

輸出則變成

New var:....... i = 9
New var:....... lst = [681, 267, 74, 832, 284, 678, ...]
09:37:35.881721 line        10         lower = min(lst)
New var:....... lower = 74
09:37:35.882137 line        11         upper = max(lst)
New var:....... upper = 832
09:37:35.882304 line        12         mid = (lower + upper) / 2
74 453.0 832
New var:....... mid = 453.0
09:37:35.882486 line        13         print(lower, mid, upper)
Elapsed time: 00:00:00.000344

你可以把 stderr 導向到一個 log 檔案

@pysnooper.snoop('/my/log/file.log')

專案網址

也許你會有興趣

找相關課程?試看看 Soft & Share 網站搜尋引擎

✍ 搜尋結果太多?可參考 Soft & Share 搜尋引擎使用技巧

追蹤 Soft & Share

幫我們個小忙!

Image by mohamed Hassan from Pixabay

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

Powered by WordPress.com.

Up ↑

%d 位部落客按了讚: