介紹幾款 Python 型別檢查工具

2022-01-10 18:56:42 字數 2102 閱讀 9537

近日,微軟在 github 上開源了乙個 python 靜態型別檢查工具:pyright,引起了社群內的多方關注。

微軟在開源專案上的參與力度是越來越大了,不說收購 github 這種大的戰略野心,只說它家開源的 vs code 編輯器,在猿界已經割粉無數,連我們 python 圈的紅人 kenneth reitz (多個開源專案的作者,包括 requests、requests-html、responder等)都對它讚不絕口。

如今開源的 pyright ,口碑還不錯,那我們就來看看它有啥本事,順便再介紹其它幾款型別檢查工具。

眾所周知,python 是一門動態型別語言,在執行期才知道變數的實際型別。這本就是動態語言的特色,然而在團隊合作或大型專案上,維護的代價也不可避免,俗話說的是:「動態一時爽,重構火葬場」。

早在 2006 年的 pep-3107,python 就推出了函式註解的功能,最終落在 3.0 版本實現。而到了 3.5 版本,python 繼續引入了靜態型別檢查的語法(即 pep-484,type hints)。2014 年的 pep-483 更是以《the theory of type hints》為題,做出了理論上的歸納。後來,又陸續提出了 pep-526、pep-544,型別檢查的規範逐漸豐富。

型別檢查的好處是及早檢查,提前發現型別的錯誤,增強**的一致性與可維護性。(還有防止脫髮,喵)

# 不加檢查

def greeting(name):

return 'hello ' + name

​ # 新增檢查

def greeting(name: str) -> str:

return 'hello ' + name

如上例所示,增加檢查後,可以在編譯期就判斷入參和返回值是否是字串型別。

在微軟推出 pyright 之前,主流的靜態檢查工具有三款:官方的mypy、google 出的pytype、facebook 出的pyre-check。三足鼎立的局面要被打破了。

pyright 的文件宣稱它有如下特點:

就此而言,不可謂不強大。事實上,pyright 是「站在了巨人的肩膀上」,它的各項功能似乎都繼承自其它幾位前輩。

接著看官方的 mypy ,它由「python 之父」 guido van rossum 親自參與開發,是最主流的選擇,推出得早,使用者基數大,文件與社群經驗也最豐富。

在整合 ide 方面,所有主流的編輯器都支援:pycharm、vim、emacs、sublime text、vs code、atom......在業界經驗上,instagram 和 dropbox 的專案從 py2 遷移到 py3 ,就是用的它來做保障。

接著看谷歌的 pytype ,據文件描述,它可以:

檢視文件,我發現它有個功能還挺人性化的,即「錯誤降噪」,對於那些不必修改的錯誤,可以新增注釋,來消除型別檢查。

此外,還有乙個考慮也不錯,為了寫型別檢查,模組中可能會額外引入其它的模組,對於後者,pytype 有辦法隱藏它,只在做型別檢查時才載入。

最後,要介紹的是臉書的 pyre-check,它是去年開源的,也曾收穫一片好評(說不定正是因為它,微軟才上馬了 pyright 專案也說不定)。

基本的功能點大同小異,不過它也是有亮點的。pyre-check 可整合watchman模組,該「觀察者」會監聽**檔案,跟蹤所做的修改。微軟的 pyright 有個 watch 模式,應該是吸收了這點,而且更加好用(因為不需要額外安裝 watchman 和其它依賴)。

pyre-check 還有個亮點,它有個query引數,可以對原始碼做區域性區域性的檢查,例如查詢某行中乙個表示式的型別、查詢乙個類的全部方法並返回成列表,等等,這樣可以避免做全面的檢查。

4 種型別檢查工具介紹完畢,下面是乙份概要對比:

介紹幾款 Python 型別檢查工具

近日,微軟在 github 上開源了乙個 python 靜態型別檢查工具 pyright,引起了社群內的多方關注。微軟在開源專案上的參與力度是越來越大了,不說收購 github 這種大的戰略野心,只說它家開源的 vs code 編輯器,在猿界已經割粉無數,連我們 python 圈的紅人 kennet...

介紹幾款 Python 型別檢查工具

近日,微軟在 github 上開源了乙個 python 靜態型別檢查工具 pyright 引起了社群內的多方關注。微軟在開源專案上的參與力度是越來越大了,不說收購 github 這種大的戰略野心,只說它家開源的 vs code 編輯器,在猿界已經割粉無數,連我們 python 圈的紅人 kennet...

介紹一款python型別檢查工具pyright

近日,微軟在 github 上開源了乙個 python 靜態型別檢查工具 pyright,引起了社群內的多方關注。微軟在開源專案上的參與力度是越來越大了,不說收購 github 這種大的戰略野心,只說它家開源的 vs code 編輯器,在猿界已割粉無數,連我 python 圈的紅人 kenneth ...