當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python typing.TypeGuard用法及代碼示例


用法:

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 告訴靜態類型檢查器對於給定函數:

  1. 返回值是一個布爾值。

  2. 如果返回值為 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 中的類型映射到 clsself 之後的第二個參數的類型。

簡而言之,形式 def foo(arg: TypeA) -> TypeGuard[TypeB]: ... 意味著如果 foo(arg) 返回 True ,則 argTypeA 縮小到 TypeB

注意

TypeB 不必是 TypeA 的更窄形式 - 它甚至可以是更寬的形式。主要原因是允許將 List[object] 縮小到 List[str] 之類的事情,即使後者不是前者的子類型,因為 List 是不變的。編寫type-safe 類型保護的責任留給用戶。

TypeGuard也適用於類型變量。有關詳細信息,請參閱佩普 647(用戶定義的類型保護)。

3.10 版中的新函數。

相關用法


注:本文由純淨天空篩選整理自python.org大神的英文原創作品 typing.TypeGuard。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。