类型定义
类型标注所使用的类型可以是 Python 内置类型,例如str
、int
等,可以是抽象基类,可以是types
模块中定义的类型,亦或者是用户自定义的类。str
、int
等类型在 Python 中常常被称为通用类型,它们在用作类型标注的时候,是不需要引入typing
模块的。
为了能够对 Python 所使用的数据类型进行描述,Python 在typings
模块中声明了一系列的特殊类型。其中包括None
、Any
、Tuple
、Union
、Callable
。其中None
与常量None
所表示的意义相同并且可以由常量None
来作为类型标注。
将类型赋予一个变量可以便捷的创建类型别名,例如:Url = str
。类型别名还可以使用更加复杂的类型,例如T = TypeVar('T', int, float, complex)
,表示类型T
可以代表整型、浮点以及复数类型,这就使得T
表现的像是一个泛型中的类型变量一样,而事实也的确如此。
在 Python 3.10 中,类型别名在typing
模块中有了一个独立的类型:TypeAlias
。现在可以使用StrList: TypeAlias = 'list[str]'
的形式来定义一个类型别名了。
在 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]
。
以下给出一些常用的类型描述:
类型 | 格式 | 说明 |
---|---|---|
None | None 类型 | |
Any | 任意类型 | |
Union | Union[X, Y] | 联合类型,可能是X 类型或者是Y 类型 |
Union | X | Y | 联合类型,可能是X 类型或者是Y 类型,与Union[X, Y] 相同。fromPython 3.10 |
Tuple | Tuple[X, Y, Z] | 多元素元组类型,一般的元组类型为Tuple[Any, ...] |
Callable | Callable[[X, Y], Z] | 函数类型,第一个序列为参数类型,第二个元素为返回值类型 deprecatedPython 3.10 |
Iterable | Iterable[X] | 序列类型,元素类型为X |
Set | Set[T] | 集合类型,元素类型为T |
Mapping | Mapping[K, V] | 字典类型,键类型为K ,值类型为V |
TypeVar | TypeVar('Name', Types) | 定义类型变量 |
NoReturn | 永远不会返回的函数返回值类型 | |
Never | 用于定义永远不会返回或者不应该被调用的函数,与NoReturn 的含义相同 fromPython 3.11 | |
Optional | Optional[X] | 可空类型,相当于Union[X, None] |
AnyStr | 任意字符串类型,相当于TypeVar('AnyStr', str, bytes) deprecatedPython 3.13 | |
Generator | Generator[Y, S, R] | 生成器类型,其中Y 为抛出类型,S 为发送类型,R 为返回值类型 |
LiteralString | 只包括字符串字面量的特殊类型 fromPython 3.11 | |
Self | 用于表示当前闭包内的类,例如表示返回完成构造的当前类的实例 fromPython 3.11 | |
TypeAlias | 用于显式声明类型别名 deprecatedPython 3.12 | |
Concatenate | Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable] | 用于注解高阶函数 fromPython 3.10 |
Literal | Literal[...] | 用于定义字面量类型 |
ClassVar | ClassVar[T] | 用于标注类变量 |
Final | Final[T] | 用于表示不可被覆盖的、不可在认可作用域中被重写的内容 |
Required | 定义 TypeDict 中的必须键 fromPython 3.11 | |
NotRequired | 定义 TypeDict 中的不必要键 fromPython 3.11 | |
ReadOnly | 定义 TypeDict 为只读 fromPython 3.13 | |
Annotated | Annotated[T, x] | 标记注解,可以将x 添加到T 的元信息中 fromPython 3.9 |
TypeIs | TypeIs[T] | 用来注解用户定义的谓词函数的返回值类型。 fromPython 3.13 |
TypeGuard | TypeGuard[T] | 用于标记用户定义的谓词函数,其返回值指示参数是否为某个特定类型的实例。 fromPython 3.10 |