如何用类型别名实现Pydantic约束列表并通过Mypy类型检查?
解决方案
要同时满足三个目标,你可以结合类型别名和Pydantic的Annotated(Pydantic v2原生支持,v1版本需从typing_extensions导入)实现,既复用约束逻辑,又能通过Mypy类型检查:
1. 导入必要模块
from pydantic import BaseModel, conlist from typing import Annotated, List # Pydantic v1版本请替换为: # from typing_extensions import Annotated
2. 定义可复用的带约束类型
用Annotated把Pydantic的约束规则和标准List类型结合——Mypy能识别标准List类型,Pydantic则会读取并应用conlist的校验规则:
class A(BaseModel): x: int # 定义复用类型:元素为A的列表,长度≥1 ListA = Annotated[List[A], conlist(A, min_items=1)]
3. 在模型中复用该类型
class B(BaseModel): items: ListA # 注意:`as`是Python关键字,不能用作字段名,这里改用`items`,也可以用`as_`规避冲突 class C(BaseModel): items: ListA
关键说明
- 约束生效:
Annotated中的conlist会让Pydantic强制执行列表长度≥1的校验,空列表会直接触发验证错误。 - Mypy兼容:对Mypy而言,
Annotated[List[A], ...]等价于标准的List[A]类型,能顺利通过类型检查。 - 代码复用:
ListA可以在任意模型中重复使用,无需重复编写约束逻辑。
内容的提问来源于stack exchange,提问作者allstar
相关产品推荐
相关产品推荐

