調試救星!利用 ObjWatch 在複雜的 Python 專案中進行高效的程式碼理解和調試
原始碼連結
啊啊啊
/
對象觀察
️ ObjWatch 是一個用於追蹤和監視物件屬性和方法呼叫的 Python 函式庫。
ObjWatch
[ 英文 | 中文]
概述
ObjWatch 是一個強大的 Python 函式庫,旨在簡化複雜專案的偵錯和監控。透過提供物件屬性和方法呼叫的即時追蹤,ObjWatch 使開發人員能夠更深入地了解其程式碼庫,從而促進問題見解、效能最佳化和整體程式碼品質增強。
ObjWatch 可能會影響您的應用程式的效能。建議僅在調試環境中使用它。
特點
-
巢狀結構追蹤:透過清晰的分層日誌記錄視覺化和監控巢狀函數呼叫和物件互動。
-
增強的日誌記錄支援:利用 Python 的內建日誌記錄模組進行結構化、可自訂的日誌輸出,包括對簡單和詳細格式的支援。此外,為了確保即使記錄器被外部程式庫停用或刪除也能擷取日誌,您可以設定 level="force"。當 level 設定為「force」時,ObjWatch 會繞過標準日誌處理程序並使用 print() 來…
當前調試痛點
在讀取和調試複雜項目時,經常會遇到多達十幾層的嵌套調用,導致難以確定執行順序。最令人沮喪的方面是在多進程環境中進行偵錯;調試單一進程常常會導致其他進程等待並逾時,需要不斷重新啟動偵錯程式。頻繁使用print語句會導致錯過函數調用,費時費力。目前還沒有一個兼具簡單性和全面性的調試庫,所以我花了一個週末開發了一個工具來解決這個痛點。
什麼是 ObjWatch?
ObjWatch 專為簡化複雜專案的調試和監控而設計。它提供物件屬性和方法呼叫的即時追蹤,並允許自訂掛鉤來幫助開發人員更深入地了解程式碼庫。
快速使用範例
您可以直接使用 pip install objwatch 安裝它。為了演示目的,您需要克隆原始程式碼:
git clone https://github.com/aeeeeeep/objwatch cd objwatch pip install . python3 examples/example_usage.py
執行上述程式碼會產生以下呼叫資訊:
[2025-01-04 19:15:13] [DEBUG] objwatch: Processed targets: >>>>>>>>>> examples/example_usage.py <<<<<<<<<< [2025-01-04 19:15:13] [WARNING] objwatch: wrapper 'BaseLogger' loaded [2025-01-04 19:15:13] [INFO] objwatch: Starting ObjWatch tracing. [2025-01-04 19:15:13] [INFO] objwatch: Starting tracing. [2025-01-04 19:15:13] [DEBUG] objwatch: run main <- [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.__init__ <- '0':(type)SampleClass, '1':10 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.__init__ -> None [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.increment <- '0':(type)SampleClass [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value None -> 10 [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 10 -> 11 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.increment -> None [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.increment <- '0':(type)SampleClass [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 11 -> 12 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.increment -> None [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.increment <- '0':(type)SampleClass [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 12 -> 13 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.increment -> None [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.increment <- '0':(type)SampleClass [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 13 -> 14 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.increment -> None [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.increment <- '0':(type)SampleClass [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 14 -> 15 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.increment -> None [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.decrement <- '0':(type)SampleClass [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 15 -> 14 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.decrement -> None [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.decrement <- '0':(type)SampleClass [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 14 -> 13 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.decrement -> None [2025-01-04 19:15:13] [DEBUG] objwatch: | run SampleClass.decrement <- '0':(type)SampleClass [2025-01-04 19:15:13] [DEBUG] objwatch: | | upd SampleClass.value 13 -> 12 [2025-01-04 19:15:13] [DEBUG] objwatch: | end SampleClass.decrement -> None [2025-01-04 19:15:13] [DEBUG] objwatch: end main -> None [2025-01-04 19:15:13] [INFO] objwatch: Stopping ObjWatch tracing. [2025-01-04 19:15:13] [INFO] objwatch: Stopping tracing.
程式碼中最關鍵的部分如下:
# Using as a Context Manager with Detailed Logging with objwatch.ObjWatch(['examples/example_usage.py']): main() # Using the API with Simple Logging obj_watch = objwatch.watch(['examples/example_usage.py']) main() obj_watch.stop()
我們可以透過上下文管理器和 API 呼叫來使用該工具。在範例中,我們指定對examples/example_usage.py 檔案進行跟踪,這表示工具將記錄examples/example_usage.py 中的任何函數、方法或變數。這種清晰的分層日誌記錄有助於視覺化和監視巢狀函數呼叫和物件互動。列印的日誌包括以下幾個執行類型:
- run:表示函數或類別方法執行的開始。
- end:表示函數或類別方法執行結束。
- upd:代表建立一個新變數。
- apd:表示為清單、集合或字典等資料結構新增元素。
- pop:標記從資料結構(如清單、集合或字典)中刪除元素。
範例相對簡單,但此功能對於執行大型專案非常有用。
整體特點
ObjWatch 提供以下介面:
- 目標(清單):要監視的檔案或模組。
- except_targets(列表,可選):要從監視中排除的檔案或模組。
- ranks(列表,可選):使用 torch.distributed 時要追蹤的 GPU 排名。
- 輸出(str,可選):用於寫入日誌的檔案的路徑。
- output_xml(str,可選):用於寫入結構化日誌的 XML 檔案的路徑。如果指定,追蹤資訊將以巢狀 XML 格式儲存,以便於瀏覽和分析。
- level (str, 可選): 日誌記錄等級(例如logging.DEBUG、logging.INFO、force等)。
- simple (bool, 可選): 啟用簡單日誌記錄模式,格式為「DEBUG: {msg}」。
- 包裝器(FunctionWrapper,可選):自訂包裝器以擴展追蹤和日誌記錄功能。
- with_locals(bool,可選):在函數執行期間啟用函數內局部變數的追蹤和記錄。
- with_module_path (bool, 可選): 控制是否在日誌中的函式名稱前面新增模組路徑。
主要功能:自訂包裝擴展
ObjWatch 提供了 FunctionWrapper 抽象基類,允許使用者建立自訂包裝器來擴展和自訂庫的追蹤和日誌記錄功能。透過繼承FunctionWrapper,開發人員可以實現針對特定專案需求的客製化行為。這些行為會在函數呼叫和返回時執行,提供更專業的監控。
函數包裝類
FunctionWrapper 類別定義了兩個必須實作的核心方法:
- wrap_call(self,func_name:str,frame:FrameType)-> str:
該方法在函數呼叫開始時被呼叫。它接收函數名稱和當前幀對象,其中包含執行上下文,包括局部變數和呼叫堆疊。實現此方法以在函數執行之前提取、記錄或修改資訊。
- wrap_return(self, func_name: str, result: Any) -> str:
此方法在函數傳回時呼叫。它接收函數名稱和函數傳回的結果。使用此方法在函數完成執行後記錄、分析或變更資訊。
- wrap_upd(self, old_value: Any, current_value: Any) ->元組[str, str]:
當變數更新時會觸發方法,接收舊值和目前值。它可用於記錄變數的更改,從而允許追蹤和調試變數狀態轉換。
有關框架物件的更多詳細信息,請參閱Python官方文件。
張量形狀記錄器
這是我根據我的使用場景實現的自訂包裝器的範例。程式碼位於 objwatch/wrappers.py 檔案中。此包裝器會自動記錄指定模組內所有函數方法呼叫中輸入和輸出的張量形狀以及變數的狀態。這對於理解複雜分散式框架的執行邏輯非常有用。
git clone https://github.com/aeeeeeep/objwatch cd objwatch pip install . python3 examples/example_usage.py
在深度學習項目中,張量的形狀和維度至關重要。小尺寸誤差可能會導致整個模型無法正確訓練或預測。手動檢查每個張量的形狀既乏味又容易出錯。 TensorShapeLogger 自動記錄張量形狀,幫助開發人員:
- 快速識別尺寸不符問題:自動記錄形狀訊息,以便及時檢測並修復尺寸錯誤。
- 最佳化模型架構:透過追蹤張量形狀的變化,優化網路結構以提高模型效能。
- 提高調試效率:減少手動檢查張量形狀所花費的時間,從而專注於核心模型開發。
使用自訂包裝器的範例
建議參考tests/test_torch_train.py檔。該文件包含 PyTorch 訓練過程的完整範例,演示如何整合 ObjWatch 進行監控和日誌記錄。
筆記
⚠️ 效能警告
在調試環境中使用 ObjWatch 會影響程式的效能。因此,建議僅在調試和開發階段使用它。
這只是初步的寫作;我計劃隨著時間的推移添加更多。如果您覺得有用,請隨意給它一個star。
該庫仍在積極更新中。如果您有任何問題或建議,請發表評論或在儲存庫中開啟問題。
以上是調試救星!利用 ObjWatch 在複雜的 Python 專案中進行高效的程式碼理解和調試的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

處理API認證的關鍵在於理解並正確使用認證方式。 1.APIKey是最簡單的認證方式,通常放在請求頭或URL參數中;2.BasicAuth使用用戶名和密碼進行Base64編碼傳輸,適合內部系統;3.OAuth2需先通過client_id和client_secret獲取Token,再在請求頭中帶上BearerToken;4.為應對Token過期,可封裝Token管理類自動刷新Token;總之,根據文檔選擇合適方式,並安全存儲密鑰信息是關鍵。

在Python中同時遍歷兩個列表的常用方法是使用zip()函數,它會按順序配對多個列表並以最短為準;若列表長度不一致,可使用itertools.zip_longest()以最長為準並填充缺失值;結合enumerate()可同時獲取索引。 1.zip()簡潔實用,適合成對數據迭代;2.zip_longest()處理不一致長度時可填充默認值;3.enumerate(zip())可在遍歷時獲取索引,滿足多種複雜場景需求。

Inpython,IteratorSareObjectSthallowloopingThroughCollectionsByImplementing_iter __()和__next __()。 1)iteratorsWiaTheIteratorProtocol,使用__ITER __()toreTurnterateratoratoranteratoratoranteratoratorAnterAnteratoratorant antheittheext__()

要使用Python創建現代高效的API,推薦使用FastAPI;其基於標準Python類型提示,可自動生成文檔,性能優越。安裝FastAPI和ASGI服務器uvicorn後,即可編寫接口代碼。通過定義路由、編寫處理函數並返回數據,可以快速構建API。 FastAPI支持多種HTTP方法,並提供自動生成的SwaggerUI和ReDoc文檔系統。 URL參數可通過路徑定義捕獲,查詢參數則通過函數參數設置默認值實現。合理使用Pydantic模型有助於提升開發效率和準確性。

要測試API需使用Python的Requests庫,步驟為安裝庫、發送請求、驗證響應、設置超時與重試。首先通過pipinstallrequests安裝庫;接著用requests.get()或requests.post()等方法發送GET或POST請求;然後檢查response.status_code和response.json()確保返回結果符合預期;最後可添加timeout參數設置超時時間,並結合retrying庫實現自動重試以增強穩定性。

在Python中,函數內部定義的變量是局部變量,僅在函數內有效;外部定義的是全局變量,可在任何地方讀取。 1.局部變量隨函數執行結束被銷毀;2.函數可訪問全局變量但不能直接修改,需用global關鍵字;3.嵌套函數中若要修改外層函數變量,需使用nonlocal關鍵字;4.同名變量在不同作用域互不影響;5.修改全局變量時必須聲明global,否則會引發UnboundLocalError錯誤。理解這些規則有助於避免bug並寫出更可靠的函數。

是的,你可以使用Python和Pandas解析HTML表格。首先,使用pandas.read_html()函數提取表格,該函數可將網頁或字符串中的HTML元素解析為DataFrame列表;接著,若表格無明確列標題,可通過指定header參數或手動設置.columns屬性修復;對於復雜頁面,可結合requests庫獲取HTML內容或使用BeautifulSoup定位特定表格;注意JavaScript渲染、編碼問題及多表識別等常見陷阱。

在Python中訪問嵌套JSON對象的方法是先明確結構,再逐層索引。首先確認JSON的層級關係,例如字典嵌套字典或列表;接著使用字典鍵和列表索引逐層訪問,如data"details"["zip"]獲取zip編碼,data"details"[0]獲取第一個愛好;為避免KeyError和IndexError,可用.get()方法設置默認值,或封裝函數safe_get實現安全訪問;對於復雜結構,可遞歸查找或使用第三方庫如jmespath處理。
