You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Pydantic(V2) BaseModel中列表元素添加约束?

解决Pydantic中列表元素的正值验证问题

要确保list[float]类型的每个元素都是正值,你可以通过以下两种常用方法实现:

方法一:使用Annotated为列表元素添加约束(Pydantic v2推荐)

通过Annotated为单个float类型定义正值约束,再将其作为列表的元素类型,Pydantic会自动验证列表中的每一个元素:

from pydantic import BaseModel, Field, Annotated

# 定义带正值约束的浮点类型
PositiveFloat = Annotated[float, Field(gt=0)]

class Product(BaseModel):
    prices: list[PositiveFloat] = Field(
        max_length=3,
        min_length=2,
    )

# 测试:传入包含负值的列表会触发验证错误
try:
    p1 = Product(prices=[1., -1.])
except Exception as e:
    print(e)  # 输出:1 validation error for Product
              # prices.1
              #   Input should be greater than 0 [type=greater_than, input_value=-1.0, input_type=float]

方法二:使用自定义字段验证器

如果需要更灵活的验证逻辑(比如额外业务规则),可以用field_validator装饰器实现自定义验证:

from pydantic import BaseModel, Field, field_validator

class Product(BaseModel):
    prices: list[float] = Field(
        max_length=3,
        min_length=2,
    )

    @field_validator('prices')
    def check_positive_prices(cls, value):
        for price in value:
            if price <= 0:
                raise ValueError(f"价格必须为正值,无效值: {price}")
        return value

# 测试:同样会触发错误
try:
    p1 = Product(prices=[1., -1.])
except Exception as e:
    print(e)  # 输出:1 validation error for Product
              # prices
              #   价格必须为正值,无效值: -1.0 [type=value_error, input_value=[1.0, -1.0], input_type=list]

为什么原代码的gt=0不生效?

Field的gt参数是作用于整个字段的值(即这里的list对象),而非列表中的单个元素。Pydantic会尝试将整个列表与0比较,这显然不符合你的验证需求,因此需要针对列表元素单独设置约束。

内容的提问来源于stack exchange,提问作者aura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:55:46