Python中型別檢查的詳細介紹

高洛峰
發布: 2017-02-20 10:21:24
原創
1601 人瀏覽過

前言

大家都知道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__ == &#39;__main__&#39;: 
 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
登入後複製

Python中型別檢查的詳細介紹

Mypy 支援的常用類型如下表所示(來自官方文件):

Python中型別檢查的詳細介紹

其中List/Dict/Iterable/Sequence/Any來自標準函式庫typing。這裡的Sequence和Iterable分別對應collections.abc.Sequencecollections.abc.Iterable,簡單來區分Sequence是可以透過數字下標索引的,而Iterable可以代表生成器:

Python中型別檢查的詳細介紹

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=&#39;&#39;,
  body=None # type: List[str]
  ):
 # type: (...) -> bool
 """Send an email message. Return True if successful."""
 pass
登入後複製

更多Python中類型檢查的詳細介紹相關文章請關注PHP中文網!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板