Python-typing: 類型標註與支持 Any類型詳解
Any docs
Any 是一種特殊的類型。
靜態類型檢查器將所有類型視為與 Any 兼容,反之亦然, Any 也與所有類型相兼容。
這意味著可對類型為 Any 的值執行任何操作或方法調用,並將其賦值給任何變量:
from typing import Any a = None # type: Any a = [] # OK a = 2 # OK s = '' # type: str s = a # OK def foo(item: Any) -> int: # Typechecks; 'item' could be any type, # and that type might have a 'bar' method item.bar() ...
需要註意的是,將 Any 類型的值賦值給另一個更具體的類型時,Python不會執行類型檢查。例如,當把 a 賦值給 s 時,即使 s 被聲明為 str 類型,在運行時接收到的是 int 值,靜態類型檢查器也不會報錯。
此外,所有返回值無類型或形參無類型的函數將隱式地默認使用 Any 類型:
def legacy_parser(text): ... return data # A static type checker will treat the above # as having the same signature as: def legacy_parser(text: Any) -> Any: ... return data
當需要混用動態類型和靜態類型的代碼時,上述行為可以讓 Any 被用作 應急出口 。
Any 和 object 的行為對比。
與 Any 相似,所有的類型都是 object 的子類型。然而不同於 Any,反之並不成立: object 不是 其他所有類型的子類型。
這意味著當一個值的類型是 object 的時候,類型檢查器會拒絕對它的幾乎所有的操作。把它賦值給一個指定瞭類型的變量(或者當作返回值)是一個類型錯誤。
比如說:
def hash_a(item: object) -> int: # Fails; an object does not have a 'magic' method. item.magic() ... def hash_b(item: Any) -> int: # Typechecks item.magic() ... # Typechecks, since ints and strs are subclasses of object hash_a(42) hash_a("foo") # Typechecks, since Any is compatible with all types hash_b(42) hash_b("foo")
使用 object 示意一個值可以類型安全地兼容任何類型。使用 Any 示意一個值地類型是動態定義的。
補充:python3.5 typing — 類型標註支持
函數接受並返回一個字符串,註釋像下面這樣:
def greeting(name: str) -> str: return 'Hello' + name
在函數 greeting 中,參數 name 預期是 str 類型,並且返回 str 類型。子類型允許作為參數。
1.1. 類型別名
型別名通過將類型分配給別名來定義。在這個例子中, Vector 和 List[float] 將被視為可互換的同義詞:
from typing import List Vector = List[float] def scale(scalar: float, vector: Vector) -> Vector: return [scalar * num for num in vector] # typechecks; a list of floats qualifies as a Vector. new_vector = scale(2.0, [1.0, -4.2, 5.4])
類型別名可用於簡化復雜類型簽名。
例如:
from typing import Dict, Tuple, List ConnectionOptions = Dict[str, str] Address = Tuple[str, int] Server = Tuple[Address, ConnectionOptions] def broadcast_message(message: str, servers: List[Server]) -> None: ... # The static type checker will treat the previous type signature as # being exactly equivalent to this one. def broadcast_message( message: str, servers: List[Tuple[Tuple[str, int], Dict[str, str]]]) -> None: ...
請註意,None 作為類型提示是一種特殊情況,並且由 type(None) 取代。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- python typing模塊–類型提示支持
- Python中typing模塊的具體使用
- python使用typing模塊加強代碼的可讀性(實戰演示)
- Python3 類型標註支持操作
- 提高 Python 開發效率的3個小工具