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
相关产品推荐
相关产品推荐

