我正在将一个微服务从PYDANIC 1迁移到PYDANC2.以前我有这样的服务:

class ComplementQuery(BaseModel):
    imports: List[str] = Field(default_factory=list)
    subquery: str = Field(...)

    @validator("imports", pre=True, each_item=True)
    def complement_imports(cls, value: str) -> str:
        return f'import "{value}"'

我阅读了文档,发现现在必须使用@field_validator.替换验证器并将"Pre=True"更改为"MODE="BEFORE".但Each_Items我不确定它应该如何寻址.现在我有如下内容:

class ComplementQuery(BaseModel):
    imports: List[Annotated[str, Field(default_factory=List)]]
    subquery: str = Field(...)

    @field_validator("imports", mode="before")
    @classmethod
    def complement_imports(cls, value: str) -> str:
        return f'import "{value}"'

COMPARY_IMPORTS验证器是否将应用于每个导入项? 或者,我是否应该将pydanti.unctionalvalidators的BeForeValidator放在该字段中?我有点困惑.

也许应该是这样的:

def complement_imports(v: str) -> str:
    return f'import "{v}"'


class ComplementQuery(BaseModel):
    imports: List[
        Annotated[str, BeforeValidator(complement_imports), Field(default_factory=List)]
    ]
    subquery: str = Field(...)

推荐答案

我认为正确的定义如下:

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

def complement_imports(v: str) -> str:
    return f'import "{v}"'


ImportItem = Annotated[str, BeforeValidator(complement_imports)]

class ComplementQuery(BaseModel):
    imports: List[ImportItem] = Field(default_factory=list)
    subquery: str = Field(...)

print(ComplementQuery(imports=["a", "b"], subquery="c"))
print(ComplementQuery(subquery="c"))

打印内容如下:

imports=['import "a"', 'import "b"'] subquery='c'
imports=[] subquery='c'

通过定义ImportItem别名,您可以简化重用.默认工厂应用于imports字段,而不是项目,如您的示例所示.

我希望这能帮到你!

Python相关问答推荐

从webhook中的短代码(而不是电话号码)接收Twilio消息

时间序列分解

Python json.转储包含一些UTF-8字符的二元组,要么失败,要么转换它们.我希望编码字符按原样保留

删除最后一个pip安装的包

如何获取TFIDF Transformer中的值?

如何在虚拟Python环境中运行Python程序?

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

当独立的网络调用不应该互相阻塞时,'

将9个3x3矩阵按特定顺序排列成9x9矩阵

Python—从np.array中 Select 复杂的列子集

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

可以bcrypts AES—256 GCM加密损坏ZIP文件吗?

如何使用使用来自其他列的值的公式更新一个rabrame列?

以异步方式填充Pandas 数据帧

根据客户端是否正在传输响应来更改基于Flask的API的行为

使用np.fft.fft2和cv2.dft重现相位谱.为什么结果并不相似呢?

如何在Python中解析特定的文本,这些文本包含了同一行中的所有内容,

迭代工具组合不会输出大于3的序列

多个布尔条件的`jax.lax.cond`等效项

如何在微调Whisper模型时更改数据集?