用法:
typing.TypeGuard
用於注釋用戶定義類型保護函數的返回類型的特殊類型形式。
TypeGuard
僅接受單個類型參數。在運行時,以這種方式標記的函數應該返回一個布爾值。TypeGuard
旨在使type narrowing
受益 - 靜態類型檢查器使用的一種技術,用於確定程序代碼流中更精確的表達式類型。通常類型縮小是通過分析條件代碼流並將縮小應用於代碼塊來完成的。這裏的條件表達式有時稱為“type guard”:def is_str(val: str | float): # "isinstance" type guard if isinstance(val, str): # Type of ``val`` is narrowed to ``str`` ... else: # Else, type of ``val`` is narrowed to ``float``. ...
有時使用用戶定義的布爾函數作為類型保護會很方便。此類函數應使用
TypeGuard[...]
作為其返回類型,以提醒靜態類型檢查器注意此意圖。使用
-> TypeGuard
告訴靜態類型檢查器對於給定函數:返回值是一個布爾值。
如果返回值為
True
,則其參數的類型是TypeGuard
內部的類型。例如:
def is_str_list(val: List[object]) -> TypeGuard[List[str]]: '''Determines whether all objects in the list are strings''' return all(isinstance(x, str) for x in val) def func1(val: List[object]): if is_str_list(val): # Type of ``val`` is narrowed to ``List[str]``. print(" ".join(val)) else: # Type of ``val`` remains as ``List[object]``. print("Not a list of strings!")
如果
is_str_list
是類或實例方法,則TypeGuard
中的類型映射到cls
或self
之後的第二個參數的類型。簡而言之,形式
def foo(arg: TypeA) -> TypeGuard[TypeB]: ...
意味著如果foo(arg)
返回True
,則arg
從TypeA
縮小到TypeB
。注意
TypeB
不必是TypeA
的更窄形式 - 它甚至可以是更寬的形式。主要原因是允許將List[object]
縮小到List[str]
之類的事情,即使後者不是前者的子類型,因為List
是不變的。編寫type-safe 類型保護的責任留給用戶。TypeGuard
也適用於類型變量。有關詳細信息,請參閱佩普 647(用戶定義的類型保護)。3.10 版中的新函數。
相關用法
- Python typing.TypedDict.__optional_keys__用法及代碼示例
- Python typing.TypedDict.__total__用法及代碼示例
- Python typing.TypeVar用法及代碼示例
- Python typing.TypedDict用法及代碼示例
- Python typing.Type用法及代碼示例
- Python typing.TypeAlias用法及代碼示例
- Python typing.TYPE_CHECKING用法及代碼示例
- Python typing.get_type_hints用法及代碼示例
- Python typing.Concatenate用法及代碼示例
- Python typing.Optional用法及代碼示例
- Python typing.Final用法及代碼示例
- Python typing.Protocol用法及代碼示例
- Python typing.NoReturn用法及代碼示例
- Python typing.is_typeddict用法及代碼示例
- Python typing.AsyncGenerator用法及代碼示例
- Python typing.final用法及代碼示例
- Python typing.ClassVar用法及代碼示例
- Python typing.ParamSpec用法及代碼示例
- Python typing.Literal用法及代碼示例
- Python typing.overload用法及代碼示例
注:本文由純淨天空篩選整理自python.org大神的英文原創作品 typing.TypeGuard。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。