天天看點

mypy 支援靜态類型程式設計的python變種

每種程式設計語言都有一群固定的使用者,對于那些習慣将不同程式設計語言用成同樣的感覺的人來說,最是難受。因為每種語言都有它獨特的設計『哲學』和擅長的應用領域。

PHP給大家的一貫的印象都是動态弱類型語言,Python是動态強類型語言。

就像我用慣了PHP的标量類型聲明-起到一點靜态類型的感覺,讓我去用Python的完全動态,可能是不習慣的。而強類型在大型項目中,是基本品質的保證。

mypy出現了。正如Facebook出了Hack Lang - PHP的靜态類型版,mypy也是python的靜态類型版;盡管兩者的實作原理有所不同。

Python程式設計語言的設計者Guido van Rossum,在python-ideas郵件清單中提出了一個建議:在Python函數聲明中加入類型注釋。這個建議旨在在不改變Python動态類型的本質和解釋器行為的前提下,讓Python獲得靜态類型系統所帶來的好處。

其目标是,在不改變程式執行邏輯的情況下,通過(未修改的)Python 3.5解釋器運作時,能夠對第三方子產品(甚至是stdlib)添加類型檢查注釋。

Guido所提出的添加類型注釋的建議源自于Bob Ippolito和Jukka Lehtosalo的想法。Bob Ippolito主張将Haskell的一些特性引入到Python和其他語言中。Jukka Lehtosalo則是mypy的作者,這是一個帶有試驗性質的Python變種版本,旨在将動态類型和靜态類型的好處結合起來。

Mypy是Guido建議中的主要内容。在建議中,Guido說到,可以将mypy看成一個用于Python的、類似lint的靜态檢查器。用于在編譯期或是在mypy的Python解釋器下運作時,檢查程式中類型的正确性。另一方面,程式在Python官方的解釋器下執行時,能夠不受類型注釋的影響。是以也不會有運作時類型檢查的開銷。為了達到這一點,關鍵在于用于類型注釋的文法必須符合Python 3的文法。這也是mypy的一個特性。實際上,mypy在指定類型簽名的時候使用了函數注釋這個Python 3的文法。該文法允許為函數添加任意中繼資料注釋。

随着python3.6的釋出,python的注解規範已經支援變量類型标注:

python3中,這些類型注解隻會在運作類型檢測時提示,實際運作的時候不會發生作用。

上一篇: 混沌的大腦
下一篇: 言語的力量