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

如何让Pydantic解析时将数值字段的空字符串转为0?

解决方案

方法1:使用BeforeValidator自定义字段转换逻辑

直接给需要处理的数值字段添加前置验证器,将空字符串转为0:

from pydantic import BaseModel, BeforeValidator, Field
from typing import Annotated

def empty_str_to_zero(v):
    if v == "":
        return 0
    return v

class A(BaseModel):
    a: Annotated[int, BeforeValidator(empty_str_to_zero)] = Field(default=0)

# 测试(假设目标文件内容为{"a": ""})
instance = A.parse_file("test.json")
print(instance.dict())  # 输出: {'a': 0}

该方法针对性强,仅对指定字段生效,不影响其他字段的正常校验逻辑。

方法2:自定义可转换空字符串的数值类型

如果多个字段都需要相同的转换规则,可以自定义复用类型,避免重复编写验证逻辑:

from pydantic import BaseModel, GetCoreSchemaHandler
from typing import Any, TypeVar
from pydantic_core import core_schema

T = TypeVar('T', int, float)

def empty_str_to_default(default: T):
    def validator(v: Any) -> Any:
        if v == "":
            return default
        return v
    return validator

class ZeroableInt(int):
    @classmethod
    def __get_pydantic_core_schema__(cls, source_type: Any, handler: GetCoreSchemaHandler) -> core_schema.CoreSchema:
        return core_schema.no_info_wrap_validator_function(
            empty_str_to_default(0),
            handler(int),
        )

class A(BaseModel):
    a: ZeroableInt = 0
    b: ZeroableInt = 0  # 其他需要转换的字段直接复用该类型

# 测试
instance = A.parse_file("test.json")
print(instance.dict())  # 若文件中b字段为空字符串,输出: {'a': 0, 'b': 0}

这种方式适合大量字段需要相同转换规则的场景,代码更简洁易维护。

补充说明

  • 以上代码基于Pydantic v2版本编写,若使用v1版本,需替换为validator装饰器实现前置转换;
  • 转换逻辑仅处理存在但为空字符串的字段,字段缺失时依然会使用Field(default=0)设置的默认值,完全匹配需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:26:13