利用 inspect 模組在 Python 快速除錯

Mosky Liu
Mosky Liu
Mar 15, 2016 · 3 min read
只要是工程師都需要「inspect」

大家可能很熟悉 Chrome 的開發人員工具(右鍵、Inspect),但同時也可能漏了這個在 Python 中有著一樣名字的模組—— inspect。

如其簡短有力的介紹:

inspect — Inspect live objects

inspect 就是幫你檢視記憶體中 Python 物件的好工具。記得 “Everything is an object in Python.” 嗎?沒錯,inspect 可以檢視在 Python 裡的所有東西。

inspect.stack

除了常用的資料型態以外,其實在 Python 包含 traceback、frame、甚至 code 都是 Python 物件。traceback 是大家常看到、告訴你錯在哪行的錯誤訊息字串的物件版本,frame 則保存了每一層函數呼叫裡的變數,最後 code 真的就是指 Python 的程式碼,只是這個程式碼是已經被載入記憶體的物件版本。

利用 inspect 模組,就可以一一地細看這些物件。也可以開大絕:inspect.stack!這邊示範一個簡單例子:

這是一個呼叫 fg 再呼叫 f 的簡單程式。我在 f 的開頭加入了唯一和平常不一樣的一行:

pprint(inspect.stack())

加入這行之後,每次執行到 f,Python 就會把整個呼叫堆疊(call stack)一層一層地印出來!這讓你可以在 Python 程式中的任何一行追蹤是從哪裡執行到這。

常常我們遇到很慢的函數或很慢的類別(通常是有 IO),我們知道這裡慢,不該呼叫太多次,但偏偏我們就是不知道究竟哪兒呼叫他。透過 inspect.stack,可以在僅加入一行的成本下,快速找到究竟是哪。對於除錯來說非常實用。

inspect 不只可以做這些

就像前面提到的,inspect 模組的基礎用途是檢視物件,因此裡面可以做的事不只除錯,只是剛好這個特點非常實用。

裡頭好用的還包含像 inspect.getmoduleinspect.getsourcefileinspect.ismoduleinspect.ismethodinspect.isfunction … 等等好用的工具。

還有像 Clime 這個套件,就是利用 inspect.signature 這個函數來取得函數所接受的參數,進一步地在不需要任何其他設定的狀況下轉換函數成命令列程式。

是不是很好用呢?按 inspect — Inspect live objects 看詳細文件。

這是 Pinkoi Engineering 的第一篇文章,喜歡我們的話記得按下 follow 喲!

Mosky Liu

Written by

Mosky Liu

♥ Python, Web, statistics, and open source!

Pinkoi Engineering

用 好 設 計 實 現 美 感 生 活

More From Medium

Related reads

Related reads

Related reads

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade