​Python 3 新特性:型別註解

Crossin先生發表於2019-03-03

前幾天有同學問到,這個寫法是什麼意思:

def add(x:int, y:int) -> int:
    return x + y
複製程式碼

我們知道 Python 是一種動態語言,變數以及函式的引數是不區分型別。因此我們定義函式只需要這樣寫就可以了:

def add(x, y):
    return x + y
複製程式碼

這樣的好處是有極大的靈活性,但壞處就是對於別人程式碼,無法一眼判斷出引數的型別,IDE 也無法給出正確的提示。

於是 Python 3 提供了一個新的特性:
函式註解

也就是文章開頭的這個例子:

def add(x:int, y:int) -> int:
    return x + y
複製程式碼

: 型別 的形式指定函式的引數型別,用 -> 型別 的形式指定函式的返回值型別。

然後特別要強調的是,Python 直譯器並不會因為這些註解而提供額外的校驗,沒有任何的型別檢查工作。也就是說,這些型別註解加不加,對你的程式碼來說沒有任何影響

​Python 3 新特性:型別註解​Python 3 新特性:型別註解

輸出:

​Python 3 新特性:型別註解​Python 3 新特性:型別註解

但這麼做的好處是:

  1. 讓別的程式設計師看得更明白
  2. 讓 IDE 瞭解型別,從而提供更準確的程式碼提示、補全和語法檢查(包括型別檢查,可以看到 str 和 float 型別的引數被高亮提示)
​Python 3 新特性:型別註解​Python 3 新特性:型別註解

在函式的 __annotations__ 屬性中會有你設定的註解:

​Python 3 新特性:型別註解​Python 3 新特性:型別註解

輸出:

​Python 3 新特性:型別註解​Python 3 新特性:型別註解

在 Python 3.6 中,又引入了對變數型別進行註解的方法:

a: int = 123
b: str = `hello`
複製程式碼

更進一步,如果你需要指明一個全部由整陣列成的列表:

from typing import List
l: List[int] = [1, 2, 3]
複製程式碼

但同樣,這些僅僅是“註解”,不會對程式碼產生任何影響。

不過,你可以通過 mypy 庫來檢驗最終程式碼是否符合註解。

安裝 mypy:

pip install mypy
複製程式碼

執行程式碼:

mypy test.py
複製程式碼

如果型別都符合,則不會有任何輸出,否則就會給出類似輸出:

​Python 3 新特性:型別註解​Python 3 新特性:型別註解

這些新特性也許你並不會在程式碼中使用,不過當你在別人的程式碼中看到時,請按照對方的約定進行賦值或呼叫。

當然,也不排除 Python 以後的版本把型別檢查做到直譯器裡,誰知道呢。

════
其他文章及回答:

如何自學Python | 新手引導 | 精選Python問答 | Python單詞表 | 區塊鏈 | 人工智慧

歡迎關注:Crossin的程式設計教室

​Python 3 新特性:型別註解

相關文章