pydantic root_validator:mypy 严格类型检查



我正在寻找在 pydanticroot_validator装饰方法中进行严格类型检查的"适当"方法。

举个例子:在validate_model方法中,我希望能够使用 mypy 严格的类型检查。由于在调用此方法时,first_nameage都已经过验证和类型检查,因此我们可以假设values['first_name']values['age']分别属于 'str' 和 'int' 类型。

您可以看到我用来允许类型提示和停止 mypy 抱怨的# type:ignore"hack",但它非常丑陋,如果我更改任何变量类型可能会产生错误。理想情况下,root_validator修饰的方法应具有与类SimpleModel本身相同的values参数类型,或者应该有一种简单的方法将SimpleModel转换为TypedDict,因此我们可以在validate_model签名中使用它,例如:def validate_model(cls, values: SimpleModelTypedDict) -> SimpleModelTypedDict

无论如何,如果有人遇到类似的问题,请让我知道您是如何解决的。

from pydantic import BaseModel, root_validator
class SimpleModel(BaseModel):
first_name: str
age: int
@root_validator(skip_on_failure=True)
def validate_model(cls, values: dict) -> dict:
"""checks there are no Bobs under 60 (sorry Bob!)"""
first_name: str = values.get("first_name")  # type:ignore
age: int = values.get("age")  # type:ignore
if first_name.lower() == "bob" and age < 60:
raise ValueError("No Bobs under 60")
return values

first_nameage的正确类型提示应分别为Optional[str]Optional[int]dict.get()方法可以返回None,如果没有与提供的名称对应的字段或无效,则验证者的此values字典将返回:之前对该字段的验证失败。您使用skip_on_failure=True,我相信它应该涵盖以前验证失败的情况,但如果由于某种原因您尝试获取不存在的字段,仍然可以None.get()的返回值。

使用该类型提示,在尝试执行任何其他验证之前,应验证是否Nonefirst_nameage变量。

完整示例:

from typing import Optional
from pydantic import BaseModel, root_validator

class SimpleModel(BaseModel):
first_name: str
age: int

@root_validator(skip_on_failure=True)
def validate_model(cls, values: dict) -> dict:
"""checks there are no Bobs under 60 (sorry Bob!)"""
first_name: Optional[str] = values.get("first_name")
age: Optional[int] = values.get("age")
if first_name is not None and age is not None and first_name.lower(
) == "bob" and age < 60:
raise ValueError("No Bobs under 60")
return values