类型谓词函数
类型谓词函数是用户自己定义的用来确定给定参数是否为指定类型的函数。通俗来说就是常见的用来判定内容类型的函数。从 Python 3.10 开始,在typing
模块中引入了TypeGuard
和TypeIs
两个类型标注来显式说明谓词函数的功能和类型。
如果标记一个函数的返回值为-> TypeGuard[T]
,那么将表示这个函数是一个类型判断函数,它会遵循以下特征:
- 这个函数会返回一个布尔值。
- 如果这个函数的返回值是
True
,那么它所接受的参数的类型为包括T
在内的类型。
TypeGuard
常见的用法如下:
def is_str_array(val: list[object]) -> TypeGuard[list[str]]:
return all(isinstance(x, str) for x in val)
与TypeGuard
相似的还有TypeIs
,但是跟TypeGuard
不同的是,TypeIs
的主要目标是类型收窄(type narrowing),用来在床需代码中精确的确定被测试的类型。TypeIs
常用的实现方式如下:
def is_str(val: str | int) -> TypeIs[str]:
return isinstance(val, str)
在一个函数的返回值类型是-> TypeIs[T]
的时候,静态类型检查器会按照以下的策略处理:
- 这个类型判断函数需要返回一个布尔值。
- 如果返回的值是
True
,那么这个函数的参数的类型将收窄到T
,并且对其后的代码产生影响。 - 如果返回的值是
False
,那么这个函数的参数类型将排除T
。
TypeIs
和TypeGuard
的不同主要有以下几点,在使用的时候需要注意:
TypeIs
要求收窄的类型是输入类型的子类型,TypeGuard
没有这个要求。TypeGuard[T]
函数返回True
的时候,被判断参数的类型将精确收窄到T
。TypeIs[T]
函数返回True
时,静态类型检查器可以根据之前的程序做出更加精确的推断。TypeGuard
函数返回False
时,类型检查器不会收窄类型,但TypeIs
会收窄。