abstract:簡介Type Hint(或者叫做PEP-484)提供了一種針對Python程序的類型標(biāo)注標(biāo)準(zhǔn)。為什么使用Type Hint?對于動態(tài)語言而言,常常出現(xiàn)的情況是當(dāng)你寫了一段代碼后,隔段時間你可能忘記這個方法的原型是什么樣子的了,你也不清楚具體應(yīng)該傳入什么類型的參數(shù),這樣往往需要你去閱讀代碼才能定義每個類型具體是什么。或者當(dāng)你使用一個文檔并不是特別完全的第三方庫,你不知道這個庫應(yīng)該如何使用,這都會很痛
簡介
Type Hint(或者叫做PEP-484)提供了一種針對Python程序的類型標(biāo)注標(biāo)準(zhǔn)。
為什么使用Type Hint?對于動態(tài)語言而言,常常出現(xiàn)的情況是當(dāng)你寫了一段代碼后,隔段時間你可能忘記這個方法的原型是什么樣子的了,你也不清楚具體應(yīng)該傳入什么類型的參數(shù),這樣往往需要你去閱讀代碼才能定義每個類型具體是什么?;蛘弋?dāng)你使用一個文檔并不是特別完全的第三方庫,你不知道這個庫應(yīng)該如何使用,這都會很痛苦。
現(xiàn)在,借助Type Hint,你可以實(shí)現(xiàn):
1、實(shí)現(xiàn)類型檢查,防止運(yùn)行時出現(xiàn)的類型不符合情況。
2、作為文檔附加屬性,方便開發(fā)者調(diào)用時傳入傳出的參數(shù)類型。
3、提升IDE的檢查機(jī)制,在智能提示時更快給出提示和類型檢查結(jié)果。
實(shí)現(xiàn)這個過程中,你需要使用Python 3.5+中提供的新模塊typing。值得注意的是,這個改動并不會影響程序運(yùn)行,僅僅是為了方便類型檢查器實(shí)現(xiàn)的。
Type Hint類型檢查器
目前,比如JetBrains家的PyCharm已經(jīng)支持Type Hint語法檢查功能,如果你使用了這個IDE,可以通過IDE功能進(jìn)行實(shí)現(xiàn)。如果你像我一樣,使用了SublimeText編輯器,那么第三方工具mypy可以幫助到你。AnacondaST3最近要發(fā)布的2.0版本也內(nèi)置了mypy功能的支持,具體的進(jìn)度可以看一下這個issue。一些其它的Python工具(比如代碼提示工具jedi 0.10+)也支持了Type Hint功能。
從簡單的例子開始
從簡單的例子開始,我們先從一個簡單的程序開始,運(yùn)行環(huán)境為Python 3.5.2,使用mypy工具進(jìn)行檢查。
首先通過pip install mypy-lang命令安裝mypy工具。注意是mypy-lang,之所以是這樣,是因?yàn)樵趐ypi里mypy這個名字已經(jīng)被占用掉了。
接下來,通過mypy檢查下面這個文件
# fib.py from typing import Iterator def fib(n: int) -> Iterator[int]: a, b = 0, 1 while a < n: yield a a, b = b, a + b i = fib(3.2) print(next(i)) print(next(i))
在命令行中執(zhí)行命令mypy fib.py,獲取返回結(jié)果:
? mypy fib.py fib.py:11: error: Argument 1 to "fib" has incompatible type "float"; expected "int"
但是在實(shí)際的應(yīng)用過程中,這個功能在Python里是可以正常運(yùn)行的:
? mypy python fib.py 0 1
可以看到,mypy工具提示了我們的代碼中存在一處類型不匹配的問題,但是如果不進(jìn)行檢查,代碼有可能執(zhí)行出不可預(yù)知的結(jié)果。
在這個例子里面,我們使用了兩種類型,一種是Python基礎(chǔ)數(shù)據(jù)類型,比如str、int等等,這些類型數(shù)據(jù)是可以直接使用的;另外一種是來自于typing中引入的Iterator,用來表示迭代器類型。另外一個值得注意的是,typing中部分類型也會隨時添加,一般我們以演示版本為準(zhǔn)。
從簡單到復(fù)雜,類型組合怎么辦?
實(shí)際上,在我們使用過程中還有可能傳遞一些更加復(fù)雜的參數(shù)類型,比如list類型,tuple類型等等,這類型的數(shù)據(jù)如何聲明呢?我們可以先看一個例子:
def foo(strings, string_list, count, total):
這個函數(shù)的參數(shù)我們從字面可以看出來分別是str,元素為str的list類型和兩個整數(shù)參數(shù)。我們假定一個返回值為((int, int), str),那么這個類型檢查可以這樣定義:
from typing import List, Tuple Result = Tuple[Tuple[int, int], str] def foo(strings: str, lines: List[str], line_number: int, total_lines: int) -> Result:
其它的一些類型提示、協(xié)程等等的支持都可以在官方的typing模塊文檔中進(jìn)行查看。
關(guān)于生產(chǎn)的一些閑扯
我們現(xiàn)在也在進(jìn)行一些mypy工具在生產(chǎn)環(huán)境中的具體使用測試,但是我們也發(fā)現(xiàn)了一些存在的問題,比如Python本身的動態(tài)語言特性給類型標(biāo)注就帶來了一些麻煩。另外,變量復(fù)用導(dǎo)致的類型變換有可能會提示采用新的變量實(shí)現(xiàn)。這對于一個已經(jīng)存在的線上項(xiàng)目來說相對成本較高,我們后續(xù)也會在一些新項(xiàng)目中采用這種方式。另外mypy還是一個比較新的項(xiàng)目,本身是擁有一些bug。另外一個是在某些mypy的非類型錯誤提示其實(shí)非常的模糊,導(dǎo)致很多錯誤有時需要進(jìn)行人工排查。
不管怎樣,即便在mypy存在一些缺陷,但是仍舊是未來非常有潛力的工具,提前了解和應(yīng)用也能有效的提升程序的強(qiáng)壯性。以上就是利用Type Hint提升Python程序開發(fā)效率的全部內(nèi)容,希望本文對大家使用python有所幫助。
更多關(guān)于用Type Hint提高Python程序開發(fā)效率請關(guān)注PHP中文網(wǎng)(ipnx.cn)其他文章!