跳到主要内容

类型标注

在本指南中,您将了解 Python 的类型标注。

传统上,Python 解释器以灵活但隐式的方式处理类型。最新版本的 Python 允许您指定显式类型提示,IDE 工具可以使用这些提示来帮助您更高效地开发代码。

本文使用的默认需要 Python 版本 >= 3.12。

内置类型

基础类型

x: int = 1
x: float = 1.0
x: bool = True
x: str = "test"
x: bytes = b"test"

赋值时通常无需声明,因为 python 可以自动推断类型。

列表标注

x: list[int] = []  # 空列表
x: list[int] = [1] # 带单个 int 元素的列表
x: list[int] = [1, 2, 3] # 带多个 int 元素的列表

元组标注

信息

元组标注是特殊情况,需要依次对其中的元素依次指定类型。

x: tuple[()] = ()  # 空元组
x: tuple[int] = (1,) # 带单个元素的元组
x: tuple[int, int, int] = (1, 2, 3) # 带多个相同类型的元素的元组
x: tuple[int, ...] = (1, 2, 3) # 同上,tuple[T, ...] 代表任意长度、元素类型相同的元组
x: tuple[int, str, float] = (3, "yes", 7.5) # 带多个不同类型的元素的元组

集合标注

x: set[int] = {6, 7}

字典标注

x: dict[str, float] = {"field": 2.0}

可空类型

可空类型加上一个 | None 即可。

x: str | None = "test"

x: list[int] | None = None

Any 类型

Any 是一种特殊的类型。静态类型检查器认为所有类型(包含 NoneType)均与 Any 兼容,同样,Any 也与所有类型(包含 NoneType)兼容。

from typing import Any

a: Any = None

def foo(item: Any) -> int:
item.bar()

注意,Any 类型的值赋给更精确的类型时,不执行类型检查。

可调用对象标注

Callable[[int], str] 表示一个接受 int 类型的单个形参并返回一个 str 的函数。

from collections.abc import Callable

def feeder(get_item_with_index: Callable[[int], str]) -> None:
...

如果将一个省略号字面值 ... 作为参数列表,则表示可以接受包含任意形参列表的可调用对象:

x: Callable[..., str] = str
def concat(x: str, y: str) -> str:
return x + y
x: Callable[..., str] = str

泛型标注

def max[T](args: list[T]) -> T:
...

或使用 TypeVar 工厂:

from typing import TypeVar

T = TypeVar('T')

def max(args: list[T]) -> T:
...

类型别名

类型别名使用 type 语句定义。

type Vector = list[float]

type ListOrSet[T] = list[T] | set[T]

类型别名适用于简化复杂的类型签名。例如:

from collections.abc import Sequence

type ConnectionOptions = dict[str, str]
type Address = tuple[str, int]
type Server = tuple[Address, ConnectionOptions]

def broadcast_message(message: str, servers: Sequence[Server]) -> None:
...

参考文档: