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