前言
大家都知道Python 是一門強型別、動態型別檢查的語言。所謂動態類型,是指在定義變數時,我們無需指定變數的類型,Python 解釋器會在執行時自動檢查。
與靜態類型語言(如C 語言)相比,這不僅僅是少寫了幾個類型聲明字元:
#include <stdlib.h> #include <stdio.h> #define BUFF 100 char* greeting(char* name){ char* msg = (char *) malloc(sizeof(char) * BUFF); sprintf(msg, "Hello, %s!", name); return msg; } int main(){ printf("Greeting: <%s>\n", greeting("C99")); return 0; }
def greeting(name): return "Hello, {}!".format(name) def main(): print("Greeting: <%s>" % greeting("Python35")) if __name__ == '__main__': main()
動態類型從某種程度上將我們的思維從對電腦的工作模擬中解放出來,可以將更多精力集中在需要解決的問題上:就像上面的例子,我們不需要費心考慮greeting函數所接受的參數是什麼類型、傳回值是什麼類型,只需要考慮greeting函數需要實現的功能。
當然並不是說動態類型一定優於靜態型,上面的例子用C 語言和Python 相比也有失公允,如果換成Go 語言:
package main import "fmt" func greeting(name string) string { return fmt.Sprintf("Hello, %s", name) } func main() { fmt.Printf("Greeting: <%s>", greeting("Go")) }
靜態類型的優勢(從某種程度上說也是缺點)在於定義方法時制定一種強制性的協議(介面),只有遵循協議才能正確地使用。這對多人合作、開發第三方函式庫、快速定位 BUG 等是很有幫助的。靜態類型還有一大優點是可以讓 IDE 幫助提示介面用法和類型檢查,進一步提高效率。既然有這麼多優勢,那 Python 要不要也學一個?實際上Python 3.5 中的PEP 484 和Python 3.6 的PEP 526 分別加入了類型提示(Type Hints)的語法,其中PEP 484 主要關於函數、方法、類別的參數和返回值的類型聲明語法,而PEP 526添加了對變數類型的聲明:
def greeting(name: str) -> str: return "Hello, {}!".format(name)
Mypy
Mypy 是官方推薦一個靜態類型檢查工具:
python3 -m pip install mypy
可以用mypy 指令直接檢查Python 程式:
mypy greeting.py
為了方便使用,可以將其應用到IDE 中,以Atom 為例,可以安裝插件linter-mypy:
python3 -m pip install typed-ast apm install linter apm install linter-mypy
Mypy 支援的常用類型如下表所示(來自官方文件):
其中List/Dict/Iterable/Sequence/Any來自標準函式庫typing。這裡的Sequence和Iterable分別對應collections.abc.Sequence
和collections.abc.Iterable
,簡單來區分Sequence是可以透過數字下標索引的,而Iterable可以代表生成器:
Python 2.x
新增了型別註解的程式碼可以直接透過Python 3.5 解譯器執行,但對於Python 2.x 則是完全不相容的。如果要在Python 2.x 中使用,首先需要安裝typing:
pip install typing
然後可以用單行註解的形式強行加入:
def send_email(address, # type: Union[str, List[str]] sender, # type: str cc, # type: Optional[List[str]] bcc, # type: Optional[List[str]] subject='', body=None # type: List[str] ): # type: (...) -> bool """Send an email message. Return True if successful.""" pass
更多Python中類型檢查的詳細介紹相關文章請關注PHP中文網!