教你用Type Hint提高Python程式開發效率,hintpython
簡介
Type Hint(或者叫做PEP-484)提供了一種針對Python程式的類型標註標準。
為什麼使用Type Hint?對於動態語言而言,常常出現的情況是當你寫了一段代碼後,隔段時間你可能忘記這個方法的原型是什麼樣子的了,你也不清楚具體應該傳入什麼類型的參數,這樣往往需要你去閱讀代碼才能定義每個類型具體是什麼。或者當你使用一個文檔並不是特別完全的第三方庫,你不知道這個庫應該如何使用,這都會很痛苦。
現在,藉助Type Hint,你可以實現:
1、實作類別型檢查,防止運行時出現的類型不符合情況。
2、作為文檔附加屬性,方便開發人員調用時傳入傳出的參數類型。
3、提升IDE的檢查機制,在智能提示時更快給出提示和類型檢查結果。
實現這個過程中,你需要使用Python 3.5+中提供的新模組typing。值得注意的是,這個改動並不會影響程式運行,僅僅是為了方便類型檢查器實現的。
Type Hint類型檢查器
目前,比如JetBrains家的PyCharm已經支援Type Hint語法檢查功能,如果你使用了這個IDE,可以通過IDE功能進行實現。如果你像我一樣,使用了SublimeText編輯器,那麼第三方工具mypy可以協助到你。AnacondaST3最近要發布的2.0版本也內建了mypy功能的支援,具體的進度可以看一下這個issue。一些其它的Python工具(比如代碼提示工具jedi 0.10+)也支援了Type Hint功能。
從簡單的例子開始
從簡單的例子開始,我們先從一個簡單的程式開始,運行環境為Python 3.5.2,使用mypy工具進行檢查。
首先通過pip install mypy-lang命令安裝mypy工具。注意是mypy-lang,之所以是這樣,是因為在pypi裡mypy這個名字已經被佔用掉了。
接下來,通過mypy檢查下面這個檔案
# fib.pyfrom typing import Iteratordef fib(n: int) -> Iterator[int]: a, b = 0, 1 while a < n: yield a a, b = b, a + bi = fib(3.2)print(next(i))print(next(i))
在命令列中執行命令mypy fib.py,擷取返回結果:
➜ mypy fib.pyfib.py:11: error: Argument 1 to "fib" has incompatible type "float"; expected "int"
但是在實際的應用過程中,這個功能在Python裡是可以正常啟動並執行:
➜ mypy python fib.py01
可以看到,mypy工具提示了我們的代碼中存在一處類型不符的問題,但是如果不進行檢查,代碼有可能執行出不可預知的結果。
在這個例子裡面,我們使用了兩種類型,一種是Python基礎資料類型,比如str、int等等,這些類型資料是可以直接使用的;另外一種是來自於typing中引入的Iterator,用來表示迭代器類型。另外一個值得注意的是,typing中部分類型也會隨時添加,一般我們以示範版本為準。
從簡單到複雜,類型組合怎麼辦?
實際上,在我們使用過程中還有可能傳遞一些更加複雜的參數類型,比如list類型,tuple類型等等,這類型的資料如何聲明呢?我們可以先看一個例子:
def foo(strings, string_list, count, total):
這個函數的參數我們從字面可以看出來分別是str,元素為str的list類型和兩個整數參數。我們假定一個傳回值為((int, int), str),那麼這個類型檢查可以這樣定義:
from typing import List, TupleResult = Tuple[Tuple[int, int], str]def foo(strings: str, lines: List[str], line_number: int, total_lines: int) -> Result:
其它的一些類型提示、協程等等的支援都可以在官方的typing模組文檔中進行查看。
關於生產的一些閑扯
我們現在也在進行一些mypy工具在生產環境中的具體使用測試,但是我們也發現了一些存在的問題,比如Python本身的動態語言特性給類型標註就帶來了一些麻煩。另外,變數複用導致的類型變換有可能會提示採用新的變數實現。這對於一個已經存在的線上項目來說相對成本較高,我們後續也會在一些新項目中採用這種方式。另外mypy還是一個比較新的項目,本身是擁有一些bug。另外一個是在某些mypy的非類型錯誤提示其實非常的模糊,導致很多錯誤有時需要進行人工排查。
不管怎樣,即便在mypy存在一些缺陷,但是仍舊是未來非常有潛力的工具,提前瞭解和應用也能有效提升程式的強壯性。以上就是利用Type Hint提升Python程式開發效率的全部內容,希望本文對大家使用python有所協助。