當前位置:
首頁 > 知識 > 讓你的代碼給自己寫類型注釋:MonkeyType

讓你的代碼給自己寫類型注釋:MonkeyType

讓你的代碼給自己寫類型注釋:MonkeyType

Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。

今天,我們激動的宣布將MonkeyType項目開源,通過可見類型的實時追蹤,MonkeyType能夠為python3代碼自動添加類型註解。

動機

在Instagram,成百上千的工程師開發了超過百萬行的python3代碼。每天都有新的工程師從其他項目或其它語言轉過來加入團隊,這些人需要迅速熟悉並利用代碼庫來提高效率。同時每天我們都不斷地發布代碼到生產環境,每隔幾分鐘就會發布一次,並持續一整天的時間。因此,我們想要讓新的開發者更容易閱讀和理解我們的代碼,同時便於進行靜態分析以縮減可能出現缺陷的範圍。類型註解和靜態類型檢查適合該情況。

寫新代碼的時候使用類型註解很簡單;大多數工程師一上來就想到用它。但是如果想讓添加類型注釋的工作有所回報,那麼你的類型注釋必須覆蓋到足夠大比例的代碼,尤其是核心庫。換句話說,我們有太多的現存代碼需要添加類型註解。

我們手動添加類型註解的方法讓人失望。註解一個模塊就可能花費幾個小時,有時還要仔細的跟蹤多層次的函數調用和對象來理解在調用時可能的類型。(當然,這是任何人在試圖維護函數時都可能經歷的;這也是我們想添加類型註解的原因!)

因此我們編寫了MonkeyType。讓測試套件或者(更好的)你的生產系統來告訴你真實的類型,而不是在那裡猜測或者探查。

用法

聽起來很棒!我已經運行了「pip install monkeytype」。下一步呢?

在MonkeyType提供有用信息之前,我們需要讓它跟蹤函數調用。做這件事的最簡單的方式是使用「monkeytype run」,該命令會在MonkeyType跟蹤下運行Python腳本。例如,可以輕而易舉的在MonkeyType下運行測試套件:

讓你的代碼給自己寫類型注釋:MonkeyType

(或者「monkeytype run `which pytest`」,或者任何你喜歡的命令)

在測試運行的同時,MonkeyType檢查每個函數調用的參數類型和返回/生成類型,並在資料庫中記錄它們。(默認情況下,MonkeyType將它們保存在本地SQLite資料庫,但是正如MonkeyType做的所有事,這也是可配置的。)

當然,測試套件可能沒有提供很好的類型信息-有時測試並不使用真實的類型,而且我們發現很多這種情況,像類型檢查顯示偶然情況下測試傳遞不同於生產環境的類型。因此如果不想基於測試套件做註解,可以在實時運行的生產環境記錄跟蹤調用情況。針對這種情況,MonkeyType提供了上下文管理API:

讓你的代碼給自己寫類型注釋:MonkeyType

如果需要更大的彈性,你可以創建自己的CallTracer,使用sys.setprofile來安裝,完成之後就可以刪除了。

一旦完成了調用跟蹤的記錄,就可以為任意模塊生成一個stub文件:

讓你的代碼給自己寫類型注釋:MonkeyType

如果stub文件合理並且想要直接將註解應用到代碼,MonkeyType也可以做到:

讓你的代碼給自己寫類型注釋:MonkeyType

審閱在some/module.py中已經註解過的代碼,更正之後,提交。

由於後備存儲設計,不需要一次性跟蹤記錄和註解代碼。你可以經過一段長時間的收集並記錄到資料庫,然後在一切準備好之後逐步地從收集的數據給越來越多的模塊註解。

使用可配置的類型重寫器,您可以輕鬆地調整MonkeyType生成的類型注釋為您代碼庫中的首選類型注釋樣式或特定邊界用例。

要知道客戶化選項的更多細節,請查看文檔。

開源

檢出代碼,快速瀏覽,然後告訴我們你的想法!我們期待你的缺陷報告和改善建議。如果你願意貢獻,我們在問題追蹤部分有一個新手建議任務的列表。

MonkeyType要求Python3.6以上版本,只生成Python3風格的類型註解(沒有類型注釋)。如果你不十分清楚,可以從Pycon 2017 keynote著手,它告訴你我們去年是怎樣將幾百萬行代碼遷移到python3.

在Instagram是如何使用MonkeyType的?

我們挑選生產環境網頁請求的一個小的隨機樣本,通過Django中間件開啟MonkeyType跟蹤。從Facebook數據分析平台-SCUBA使用自定義的CallTraceStore來存儲和檢索跟蹤信息。我們不間斷的運行跟蹤,因此總是從生產環境添加新的類型追蹤。因為生產環境代碼時常改動,這樣做讓跟蹤信息總是最新的。

無論何時,工程師像給一個模塊添加類型註解,只需運行「monkeytype stub」,然後「monkeytype apply」,修改好新註解顯示的類型錯誤,最後提交差異即可。

結論

藉助Monkeytype的幫助,我們已經將代碼庫中三分之一的函數進行了註解,並且見證了類型檢查在代碼上線前抓出了許多缺陷。百分百讓你滿意!


英文原文:https://ogmcsrgk5.qnssl.com/vcdn/1/優質文章長圖/let-your-code-type-hint-itself-introducing-open-source-monkeytype-a855c7284881.png
譯者:javylee

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

TAG:Python部落 |