向函式新增型別

讓我們舉一個函式的例子,它接收兩個引數並返回一個表示其總和的值:

def two_sum(a, b):
    return a + b

通過檢視此程式碼,人們無法安全且毫無疑問地指出函式 two_sum 的引數型別。它在提供 int 值時都有效:

print(two_sum(2, 1))  # result: 3

和字串:

print(two_sum("a", "b"))  # result: "ab"

和其他值,如 lists,tuples 等。

由於 python 型別的這種動態特性,其中許多型別適用於給定的操作,任何型別檢查器都無法合理地斷言是否應該允許對此函式的呼叫。

為了幫助我們的型別檢查器,我們現在可以在函式定義中為它提供型別提示,指示我們允許的型別。

為了表明我們只想允許 int 型別,我們可以將我們的函式定義更改為:

def two_sum(a: int, b: int):
    return a + b

註釋遵循引數名稱,並由:字元分隔。

同樣,為了表明只允許 str 型別,我們將更改我們的函式來指定它:

def two_sum(a: str, b: str): 
    return a + b

除了指定引數的型別之外,還可以指示函式呼叫的返回值。這是通過在引數列表中在函式宣告結尾的:之前新增 -> 字元後跟型別後面的型別來完成的 :

def two_sum(a: int, b: int) -> int: 
    return a + b

現在我們已經指出呼叫 two_sum 時的返回值應該是 int 型別。同樣,我們可以為 strfloatlistset 等定義適當的值。

雖然型別提示主要由型別檢查器和 IDE 使用,但有時你可能需要檢索它們。這可以使用 __annotations__ 特殊屬性來完成:

two_sum.__annotations__
# {'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}