微軟本周發(fā)布一個小工具:pyright,它是一個靜態(tài)類型檢查器,,微軟聲稱 pyright 各方面性能優(yōu)于同行,。
Python 是一個動態(tài)語言,代碼加載到內(nèi)存并運(yùn)行至某行時,,變量類型才真正得以確定,,如下,在運(yùn)行至第2行前,,編譯器不知道 name 的類型為 str.
before()name = 'robot'after()
毋庸置疑,,python 這種語法,書寫起來相當(dāng)簡潔,,不用像 c++,,java 等語言那樣,,必須聲明類型,。
看待任何事情都要用辯證思維,此處也不例外,。簡潔的語法,,帶來了一些副作用,,下面用一個最簡單的例子說明副作用。
python 的可迭代對象一般都有一個 len 函數(shù),,計(jì)算里面元素的個數(shù),,如果入?yún)?list, tuple,, dict,, set 等,它是不會報(bào)錯的,。但是,,如果傳入10,因?yàn)閷ο?0是 int,, 顯然int 類型沒有 len 方法,,所以報(bào)錯!
len(iterable_object)
軟件產(chǎn)品要健壯,,就必須要適應(yīng)各種輸入實(shí)例,。像上面說到的,類型不符合預(yù)期,,調(diào)用方法導(dǎo)致系統(tǒng)崩潰,,這在實(shí)際項(xiàng)目中是不允許的。
為了避免這種類型沒有此方法的出錯,,實(shí)際上我們自己可以手寫一些代碼來避免,,比如上面這種情況,可以這么改,,判斷輸入?yún)?shù)obj取值類型是否為可迭代的對象,,不是則提示并返回,這種提示方法更加友好,。
from collections import abcif isinstance(obj,, abc.Iterable) is False: print('%s 不是可迭代的'%str(obj)) return
這種寫法無形中會增加很多代碼,能用一個框架統(tǒng)一解決這個問題嗎,?微軟的pyright做的就是這個事情,。
使用pyright, 代碼會簡化成這樣:
len(iterable_object: abc.Iterable)
以上介紹了 pyright 做什么的,,解決了什么問題,,如何使用。點(diǎn)擊閱讀原文了解github開源的這個框架,。