我有一个使用fastapi和pydantic的项目。我想定义标准库类型的某些子类型,例如:
def check_negative(v: int) -> int:
assert v >= 0, f"{v} is negative"
return v
PositiveInt = Annotated[int, AfterValidator(check_negative)]
class DemoModel(BaseModel):
numbers: list[PositiveInt]
问题:
以下代码仅在DemoModel示例化时传递数字列表时才运行求值。这意味着numbers
在实际用于BaseModel之前包含假值。这是不方便的,因为我想直接在定义的fastapi端点的路由中计算值,而不是等到值被传递到模型。
numbers = [PositiveInt(2), PositiveInt(-3)] <--- should throw evaluation error here
print(numbers)
demo = DemoModel(numbers=numbers) <--- throws evaluation error here
问题:
有没有一种方法可以直接在类型PositiveInt
的示例化上运行像AfterValidator
这样的验证,而不仅仅是在它用于BaseModel类的示例化时?
因此,在给定的示例中,验证错误将在第一行numbers = [PositiveInt(2), PositiveInt(-3)]
中抛出,而不是在最后的demo = DemoModel(numbers=numbers)
中抛出。
谢谢你的帮助!
2条答案
按热度按时间klsxnrf11#
不确定这是否是最好的方法,但这是我在阅读pydantic文档的这一部分后如何让它工作的:
这在
PositiveInt
的示例化上给了我Assert错误,我也可以在DemoModel中使用它。93ze6v8z2#
你可以这样使用
TypeAdapter
:关于类型适配器的Python文档:https://docs.pydantic.dev/latest/api/type_adapter/