Python typing如何在泛型中使用Literal实现带长度的Array类型标注
需求可以实现
你可以结合 Python 类型系统的 Literal 字面量类型和多参数泛型完成该设计,主流类型检查工具(mypy、pyright)都支持该用法。
实现步骤
- 定义泛型参数
需要新增一个绑定为int类型的类型参数,用于接收长度字面量:
import typing from typing import TypeVar, Generic, Literal # 元素类型泛型参数 T = TypeVar('T') # 数组长度泛型参数,限定必须是int类型 L = TypeVar('L', bound=int) class Array(Generic[T, L]): def __init__(self, length: L, default_val: T | None = None): self._length: L = length self._data: list[T] = [default_val] * length if default_val else [] # 可自行补充其他数组操作方法 def __getitem__(self, index: int) -> T: return self._data[index]
- 类型标注用法
- Python 3.8 ~ 3.10 版本需要显式套
Literal标注长度:
# 标注长度为5的int类型数组 fixed_size_array_of_five_ints: Array[int, Literal[5]] # 标注长度为4的int类型数组 fixed_size_array_of_four_ints: Array[int, Literal[4]]
- Python 3.11+ 版本支持直接写入数字字面量作为类型参数,写法和你要求的完全一致:
fixed_size_array_of_five_ints: Array[int, 5] fixed_size_array_of_four_ints: Array[int, 4]
补充说明
类型检查阶段会严格校验数组长度的匹配性,比如你把长度为4的Array[int,4]赋值给Array[int,5]类型的变量时,类型检查工具会直接抛出错误。如果需要运行时校验长度,可以在类的初始化、赋值等方法中增加长度校验逻辑即可。
内容的提问来源于stack exchange,提问作者John Demme
相关产品推荐
相关产品推荐

