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

Pydantic BaseModel实例除最后一个属性外均被解析为元组问题咨询

问题根源

这是Python基础语法特性导致的,和Pydantic框架本身逻辑无关:你在定义Payment类的字段时,除最后一个字段外,其余字段的赋值语句末尾都多写了英文逗号。
在Python语法规则里,只要值后面跟了英文逗号,哪怕没有显式写圆括号,也会被自动识别为元组:

  • 写rut: str = None, 实际等价于 rut: str = (None,)
  • 最后一个字段liquid_salary末尾没有加逗号,所以赋值就是正常的None,没有被封装为元组。

你可以运行最简代码直接验证这个语法特性:

test_val = None,
print(test_val)  # 输出 (None,)
print(type(test_val))  # 输出 <class 'tuple'>
修复方法

把所有字段定义末尾多余的英文逗号全部删除即可,修正后的模型代码如下:

from typing import List
from pydantic import BaseModel


class Payment(BaseModel):
    rut: str = None
    worked_days: int = None
    base_salary: int = None
    gratification: int = None
    liquid_salary: int = None


class RemunerationBook(BaseModel):
    payments: List[Payment] = []

修正后重新运行你的测试代码,输出就会恢复正常:

payments=[Payment(rut=None, worked_days=None, base_salary=None, gratification=None, liquid_salary=None)]

额外提示:Python类属性、函数参数不要直接用可变类型(比如空列表[])作为默认值,否则会出现所有实例共享同一个默认对象的问题。Pydantic模型中如果需要设置列表类型的默认值,推荐写法是payments: List[Payment] = Field(default_factory=list),使用前需要提前从pydantic导入Field,这个注意点和你当前遇到的元组封装问题无关。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:51:13