首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >递归模型实例化的Pydantic私有参数

递归模型实例化的Pydantic私有参数
EN

Stack Overflow用户
提问于 2021-09-08 12:01:50
回答 1查看 159关注 0票数 0

我有一个Pydantic Model,它基本上是其他模型的列表,如下所示:

代码语言:javascript
运行
复制
class Thing(BaseModel):
    _api: Api = PrivateAttr()
    id: int
    name: str

class ThingList(BaseModel):
    _api: API = PrivateAttr()
    __root__ = List[Thing]

这些内容是从我对外部API进行的API调用的JSON内容中解析出来的,例如:

代码语言:javascript
运行
复制
def some_method_somewhere(self, api, **other_args)
    ...
    response = await api.send('GET', url)
    return ThingList(__root__=response, api=api)

但是,我不明白如何让Thing模型的Pydantic实例化接收api参数。

我能看到的唯一简单的方法是让一些函数返回一个我可以从PrivateAttr(default_factory=func)调用的全局值,但这很难闻。

这个功能应该尽可能的通用。目前,可以通过迭代Response对象(可以随意假装它来自请求)将ThingList替换为一个普通的列表,但这在将来不一定是真的。(实际上,其他属性很可能来自需要集成到ThingList中的API )。

我理想中的解决方案是在ThingList类中的某个地方扩展一个方法,但是我不知道Pydantic是如何做到这一点的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-08 12:55:52

您可以在封闭模型的__init__方法中更新嵌套对象的私有属性:

代码语言:javascript
运行
复制
class Thing(BaseModel):
    _api: str = PrivateAttr()
    id: int
    name: str


class ThingList(BaseModel):
    _api: str = PrivateAttr()
    __root__: List[Thing]

    def __init__(self, *, api, **data):
        super().__init__(**data)
        self._api = api
        for item in self.__root__:
            item._api = api
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69102722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档