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