如何在Python中创建类型化列表



我试图使用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')