类型标注
在本指南中,您将了解 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:
...
参考文档:
- 标准库支持的泛型: Standard Generic Classes