函數註解是 Python 3 最獨特的功能之一,關於它的介紹,官方文件是這麼說的,“函數註解是關於使用者自定義函數使用型別的完全可選的元資訊”。也就是說,官方將函數註解的用途歸結為:為函數中的形參和返回值提供型別提示資訊。
下面是對 Python 官方文件中的範例稍作修改後的程式,可以很好的展示如何定義並獲取函數註解:
def f(ham:str,egg:str='eggs')->str:
pass
print(f.__annotations__)
輸出結果為:
{'ham': <class 'str'>, 'egg': <class 'str'>, 'return': <class 'str'>}
如上所示,給函數中的引數做註解的方法是在形參後新增冒號“:”,後接需新增的註解(可以是類(如 str、int 等),也可以是字串或者表示式);給返回值做註解的方法是將注解新增到 def 語句結尾的冒號和 -> 之間。
注意,如果引數有預設值,引數註解位於冒號和等號之間。比如 eggs:str='eggs',它表示 eggs 引數的預設值為 'eggs',新增的注解為 str。
給函數定義好註解之後,可以通過函數物件的 __annotations__ 屬性獲取,它是一個字典,在應用執行期間可以獲取。這裡再舉一個例子:
def square(number:"一個數位")->"返回number的平方":
return number**2
print(square(10))
print(square.__annotations__)
執行結果為:
100
{'number': '一個數位', 'return': '返回number的平方'}
事實上,函數註解並不局限於型別提示,而且在 Python 及其標準庫中也沒有單個功能可以利用這種註解,這也是這個功能獨特的原因。
注意,函數註解沒有任何語法上的意義,只是為函數引數和返回值做註解,並在執行獲取這些註解,僅此而已。換句話說,為函數做的註解,Python不做檢查,不做強制,不做驗證,什麼操作都不做,函數註解對Python直譯器沒任何意義。
函數註解可能的用法
PEP 3107 作為提議函數註解的官方文件,其中列出了以下可能的使用場景:
-
提供型別資訊:包括型別檢查、讓 IDE 顯示函數接受和返回的型別、適配、與其他語言的橋樑、資料庫查詢對映、RPC引數編組等;
-
其他資訊:函數引數和返回值的文件。
總之,雖然函數註解存在的時間和 Python 3 一樣長,但目前仍未找到任一常見且積極維護的包,將函數註解用作型別檢查之外的功能。Python 3 最初發布時包含函數註解的最初目的也僅是用於試驗和玩耍。