我正在寻找在 pydanticroot_validator
装饰方法中进行严格类型检查的"适当"方法。
举个例子:在validate_model
方法中,我希望能够使用 mypy 严格的类型检查。由于在调用此方法时,first_name
和age
都已经过验证和类型检查,因此我们可以假设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_name
和age
的正确类型提示应分别为Optional[str]
和Optional[int]
。dict
的.get()
方法可以返回None
,如果没有与提供的名称对应的字段或无效,则验证者的此values
字典将返回:之前对该字段的验证失败。您使用skip_on_failure=True
,我相信它应该涵盖以前验证失败的情况,但如果由于某种原因您尝试获取不存在的字段,仍然可以None
.get()
的返回值。
使用该类型提示,在尝试执行任何其他验证之前,应验证是否None
first_name
和age
变量。
完整示例:
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