我试图使用pydantic在Python中创建一个类型化列表。我的第一个想法是这样做:
class TypedObject(pydantic.BaseModel):
# some attributes and methods here
pass
class TypedList(pydantic.BaseModel):
items: List[TypedObject]
# some other methods here
然而,TypedList
并不是一个真正的列表,而是一个列表的包装。我真正想要的是TypedList
继承类似List[TypedObject]
的东西,这样我就得到了一个实际的列表,但保留了对其元素的pydantic验证。
这是可能的吗(不需要从裸列表继承并覆盖dunder方法来解析对象?)
提前感谢!
我认为您可能正在寻找"自定义根类型",尽管这只是您的一部分。
如果我们这样定义一个模型:
import pydantic
class Widget(pydantic.BaseModel):
name: str
class WidgetList(pydantic.BaseModel):
__root__: list[Widget]
当我们像这样初始化WidgetList
时:
>>> w = WidgetList(__root__=[Widget(name='foo'), Widget(name='bar')])
它像这样序列化:
>>> w.json()
'[{"name": "foo"}, {"name": "bar"}]'
我们可以使用parse_obj
方法从a创建WidgetList
列表:
>>> WidgetList.parse_obj([{"name": "foo"}, {"name": "bar"}])
WidgetList(__root__=[Widget(name='foo'), Widget(name='bar')])
不幸的是,我们不能把它当作一个列表;我们需要在创建__root__
时显式地引用它(如上所示),或者当试图访问列表成员时:
>>> w.__root__[0]
Widget(name='foo')