当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。