淺談怎麼給Python添加類型標註
Python 添加類型標註
Python 如此簡潔,書寫者在聲明變量時甚至無需考慮類型。
但是簡潔與復雜間,是存在一個平衡點的。當我們書寫較為復雜的項目時,還是希望可以擁有「靜態類型語言」強大的類型檢查和智能的提示。
好消息是,並不需要像 TypeScript 那樣,引入一個新的編譯器來給 JavaScript 做“升級”來進行類型檢查, Python 自帶的 typing 工具可以在一定程度上把 Python 變成「靜態類型語言」;壞消息是, Python 歸根結底不是「靜態類型語言」,經過我的簡單測試,其代碼還是「自由松散」的。
給 Python 標註類型
首先和讀者聲明我們的實驗環境。
❯ python --version Python 3.7.0
本文參考瞭 Python3.7 的 中文文檔 。
我們聲明一個變量,通過如下方式聲明類型:
a: int = 1 b: float = .2 print(f'{a}, {b}') # 1, 0.2
遺憾的是,在 Python 中,a: int = 1
這句話並沒什麼意義,說的直白點,就是『脫褲子放屁』;再說得好聽點, Python 的類型標註放在這裡這麼用完全沒有必要。
首先, a = 1
中解釋器會自動把 a
推斷為 int
類型,諸如 Pylance 的 Language Server 也會在我們書寫時提供 int
的方法補全。
此外,就算我們把 a
的類型規定為 int
,然後將 str
賦給 a
,解釋器和 Language Server 也完全不會報錯。如下。
a: int a = '1' print(a) # 非常迷
做上述類型檢查對於現代編譯技術而言應該是毫無難度的,但這裡就是沒有報錯、沒有警告。這大概與 Python 的設計哲學有關。
我們看看 TypeScript 是如何表現的:
TypeScript 把自己當作靜態類型語言,要求書寫時就確保類型的正確性。
使用 typing
盡管 Python 並不強制要求類型的正確性,並且會自動幫我們做強類型轉換,但是我們依舊可以享受類型標註帶來的諸多便利。
比如,我們現在要定義一個函數 foo
,函數返回一個列表 dogList
,列表中的元素都是我們自定義的類 Dog
的實例。
如果沒有類型標註,我們無法獲得智能提示,如下。
Python 中從來就不要求 List
對象中的元素都是同一類型,因此,解釋器或者 Language Server 也不會「吃力不討好」般地去把程序運行一遍,然後推斷你這個 List 裡放的東西是什麼類型。
自然,當你從 List
中拿元素時(比如上述的 dogList[0]
),它沒法告訴你 List
中你拿的元素是什麼類型,也就沒辦法提示(No suggestion.)。
這與實際業務場景不符,因為我們寫代碼時,在一個列表中裝入的往往都是同一類型。 為瞭在取元素時獲得補全提示,我們可以使用 typing.List
+ 極簡的泛型
。如下。
我們規定, foo
返回的元素必是一個 List
,且其中元素類型是 Dog
類型。然後我們的 dogList[0]
也被識別成瞭 Dog
類型,獲得瞭補全。舒服。
題外話:聰明的 Pylance
其實 Pylance 自己也可以做一些類型推導。比如我們使用生成器生成列表時, Pylance 就會判斷這個列表中元素屬於什麼類型:
結語
關於 typing
的用法,還有很多內容可以討論,我的參考資料主要是:Python3.7 的 typing中文文檔 。此外,用 Python 泛型實現函數重載相比靜態類型語言似乎十分麻煩(我參考瞭Python實用寶典的文章(知乎)),如果之後我遇到合適的場景也會成文分享。
到此這篇關於淺談怎麼給Python添加類型標註的文章就介紹到這瞭,更多相關Python添加類型標註內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 提高 Python 開發效率的3個小工具
- Python3 類型標註支持操作
- 簡析Python函數式編程字符串和元組及函數分類與高階函數
- Python 代碼智能感知類型標註與特殊註釋詳解
- python typing模塊–類型提示支持