使用Pydantic校验字段时,能否设置两种固定的列表长度?
实现列表长度只能为2或4的Pydantic校验
Pydantic的conlist无法直接指定仅允许2或4的长度,你可以通过以下方式实现需求:
方法1:自定义字段校验器(Pydantic v2+)
通过field_validator装饰器添加自定义校验逻辑,直接检查列表长度:
from pydantic import BaseModel, field_validator from typing import List class Match(BaseModel): player_ids: List[int] @field_validator('player_ids') def check_player_ids_length(cls, v): if len(v) not in {2, 4}: raise ValueError('player_ids 必须包含恰好2个或4个元素') return v
方法2:结合Annotated与后置校验器
如果希望将校验逻辑与类型注解绑定,可使用AfterValidator实现更紧凑的写法,同时校验逻辑可复用:
from pydantic import BaseModel, AfterValidator from typing import List, Annotated def validate_length(v: List[int]) -> List[int]: if len(v) not in {2, 4}: raise ValueError('必须包含恰好2个或4个元素') return v class Match(BaseModel): player_ids: Annotated[List[int], AfterValidator(validate_length)]
针对Pydantic v1的兼容写法
若你仍在使用Pydantic v1,需改用validator装饰器:
from pydantic import BaseModel, validator from typing import List class Match(BaseModel): player_ids: List[int] @validator('player_ids') def check_player_ids_length(cls, v): if len(v) not in {2, 4}: raise ValueError('player_ids 必须包含恰好2个或4个元素') return v
内容的提问来源于stack exchange,提问作者Jossy
相关产品推荐
相关产品推荐

