类型定义

类型标注所使用的类型可以是 Python 内置类型,例如strint等,可以是抽象基类,可以是types模块中定义的类型,亦或者是用户自定义的类。strint等类型在 Python 中常常被称为通用类型,它们在用作类型标注的时候,是不需要引入typing模块的。

为了能够对 Python 所使用的数据类型进行描述,Python 在typings模块中声明了一系列的特殊类型。其中包括NoneAnyTupleUnionCallable。其中None与常量None所表示的意义相同并且可以由常量None来作为类型标注。

将类型赋予一个变量可以便捷的创建类型别名,例如:Url = str。类型别名还可以使用更加复杂的类型,例如T = TypeVar('T', int, float, complex),表示类型T可以代表整型、浮点以及复数类型,这就使得T表现的像是一个泛型中的类型变量一样,而事实也的确如此。

Python 3.10 更改

在 Python 3.10 中,类型别名在typing模块中有了一个独立的类型:TypeAlias。现在可以使用StrList: TypeAlias = 'list[str]'的形式来定义一个类型别名了。

Python 3.12 更改

在 Python 3.12 中引入了一个新的关键字type用来声明类型别名,所以自 Python 3.12 开始,之前用来定义类型别名的TypeAlias就标记为即将废弃了。关键字type的用法跟其他语言中的类型声明格式是一样的,例如:type StrList = list[str]

关键字type还可以声明带泛型的类型别名,例如:type Point[T] = tuple[T, T]

函数类型较为复杂,是使用Callable来定义的。Callable使用Callable[[参数1类型, 参数2类型], 返回值类型]的格式来定义一个函数,其中列表中第一个元素是由函数所接收的全部参数的类型组成的列表,第二个元素是函数返回值的类型。例如:Callable[[int, str], str]

以下给出一些常用的类型描述:

类型格式说明
NoneNone类型
Any任意类型
UnionUnion[X, Y]联合类型,可能是X类型或者是Y类型
UnionX | Y联合类型,可能是X类型或者是Y类型,与Union[X, Y]相同。
fromPython 3.10
TupleTuple[X, Y, Z]多元素元组类型,一般的元组类型为Tuple[Any, ...]
CallableCallable[[X, Y], Z]函数类型,第一个序列为参数类型,第二个元素为返回值类型
deprecatedPython 3.10
IterableIterable[X]序列类型,元素类型为X
SetSet[T]集合类型,元素类型为T
MappingMapping[K, V]字典类型,键类型为K,值类型为V
TypeVarTypeVar('Name', Types)定义类型变量
NoReturn永远不会返回的函数返回值类型
Never用于定义永远不会返回或者不应该被调用的函数,与NoReturn的含义相同
fromPython 3.11
OptionalOptional[X]可空类型,相当于Union[X, None]
AnyStr任意字符串类型,相当于TypeVar('AnyStr', str, bytes)
deprecatedPython 3.13
GeneratorGenerator[Y, S, R]生成器类型,其中Y为抛出类型,S为发送类型,R为返回值类型
LiteralString只包括字符串字面量的特殊类型
fromPython 3.11
Self用于表示当前闭包内的类,例如表示返回完成构造的当前类的实例
fromPython 3.11
TypeAlias用于显式声明类型别名
deprecatedPython 3.12
ConcatenateConcatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable]用于注解高阶函数
fromPython 3.10
LiteralLiteral[...]用于定义字面量类型
ClassVarClassVar[T]用于标注类变量
FinalFinal[T]用于表示不可被覆盖的、不可在认可作用域中被重写的内容
Required定义 TypeDict 中的必须键
fromPython 3.11
NotRequired定义 TypeDict 中的不必要键
fromPython 3.11
ReadOnly定义 TypeDict 为只读
fromPython 3.13
AnnotatedAnnotated[T, x]标记注解,可以将x添加到T的元信息中
fromPython 3.9
TypeIsTypeIs[T]用来注解用户定义的谓词函数的返回值类型。
fromPython 3.13
TypeGuardTypeGuard[T]用于标记用户定义的谓词函数,其返回值指示参数是否为某个特定类型的实例。
fromPython 3.10

Python 3.9 更改

从 Python 3.9 版本开始,listdict可以作为通用类型用作类型标注了,而不再需要使用typing模块中的ListDict