前幾天有同學問到,這個寫法是什麼意思:
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 直譯器並不會因為這些註解而提供額外的校驗,沒有任何的型別檢查工作。也就是說,這些型別註解加不加,對你的程式碼來說沒有任何影響:
輸出:
但這麼做的好處是:
- 讓別的程式設計師看得更明白
- 讓 IDE 瞭解型別,從而提供更準確的程式碼提示、補全和語法檢查(包括型別檢查,可以看到 str 和 float 型別的引數被高亮提示)
在函式的 __annotations__
屬性中會有你設定的註解:
輸出:
在 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 以後的版本把型別檢查做到直譯器裡,誰知道呢。
════
其他文章及回答:
如何自學Python | 新手引導 | 精選Python問答 | Python單詞表 | 區塊鏈 | 人工智慧
歡迎關注:Crossin的程式設計教室