我想用Python语言创建一个数据 struct ,将Pydatics的验证器压缩到一行参数中:

也就是说.从这个开始

from pydantic import BaseModel, validator


class MyClass(BaseModel):
    a: str
    b: str
    c: str
    
    @validator('b')
    def calculate_b(cls, v, values):
        return values['a'] + v
      
    @validator('c')
    def calculate_c(cls, v, values):
        return values['a'] + values['b'] + v

对(类似)这件事

class MyClass:
    a: str
    b: str = calculate_b(...)
    c: str = calculate_c(...)

推荐答案

我的僵尸版本是:2.5.0


Note:您使用的@validator在V2中已弃用,并将在V3中删除.如果你愿意的话,你应该用field_validator来代替.

您可以使用Annotated+AfterValidator(实际上field_validator的默认模式是"after"):

from typing import Annotated

from pydantic import AfterValidator, BaseModel


class MyClass(BaseModel):
    a: str
    b: Annotated[str, AfterValidator(lambda v, values: values.data["a"] + v)]
    c: Annotated[str, AfterValidator(lambda v, values: values.data["a"] + values.data["b"] + v)]


obj = MyClass(a="a", b="b", c="c")
print(obj)
# a='a' b='ab' c='aabc'

如果注释变得很长,您可以在类外将其用作别名.但我觉得这没问题.

values个是ValidationInfo类型,为了访问数据,可以使用.data属性.

Python相关问答推荐

使用多个性能指标执行循环特征消除

使用from_pandas将GeDataFrame转换为polars失败,ArrowType错误:未传递numpy. dype对象

如何使用entry.bind(FocusIn,self.Method_calling)用于使用网格/列表创建的收件箱

如何使用Jinja语法在HTML中重定向期间传递变量?

理解Python的二分库:澄清bisect_left的使用

如何自动抓取以下CSV

TARete错误:类型对象任务没有属性模型'

Deliveryter Notebook -无法在for循环中更新matplotlib情节(保留之前的情节),也无法使用动画子功能对情节进行动画

如何使用html从excel中提取条件格式规则列表?

为什么以这种方式调用pd.ExcelWriter会创建无效的文件格式或扩展名?

如何在Python脚本中附加一个Google tab(已经打开)

ODE集成中如何终止solve_ivp的无限运行

当点击tkinter菜单而不是菜单选项时,如何执行命令?

Flask运行时无法在Python中打印到控制台

将一个双框爆炸到另一个双框的范围内

在numpy数组中寻找楼梯状 struct

根据Pandas中带条件的两个列的值创建新列

504未连接IB API TWS错误—即使API连接显示已接受''

多个矩阵的张量积

修改.pdb文件中的值并另存为新的