我发现以下 Pydantic 行为令人惊讶。
首先我创建 Item,然后使用 ItemExtended 扩展它以包含一个附加属性。现在我创建了 ItemContainer,它可以接受一个项目列表。
from typing import List
from pydantic import BaseModel
class Item(BaseModel):
thing: int
class ItemExtended(Item):
extra_thing: int = 456
class ItemContainer(BaseModel):
items: List[Item]
出于某种原因,如果我现在创建一个传入 ItemExtended 的 ItemContainer 实例,而不是将 ItemExtended 转换为一个 Item,它只是被允许,以及不需要的默认值。
即这个
ItemContainer(items=[ItemExtended(thing=123)])
变成
ItemContainer(items=[ItemExtended(thing=123, extra_thing=456)])
有没有办法严格执行项目类型,使得这个
ItemContainer(items=[ItemExtended(thing=123)])
变成
ItemContainer(items=[Item(thing=123)])
答案 0 :(得分:0)
您要求执行的操作违反了 Python 对打字的看法。 Pydantic 正在做一些具有直观意义的事情:您要求它是一个 Item
,实际上它是一个 Item
。
如果您想对所提供的内容严格一些,请创建一个更严格的子类:
from typing import List
from pydantic import BaseModel
class Item(BaseModel):
thing: int
class StrictItem(Item):
pass
class ItemExtended(Item):
extra_thing: int = 456
class ItemContainer(BaseModel):
items: List[StrictItem]
我认为您要求自动转换,但是您可以为其创建验证器。