Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何阻止Pydantic接受嵌套模型中的附加属性_Python_Pydantic - Fatal编程技术网

Python 如何阻止Pydantic接受嵌套模型中的附加属性

Python 如何阻止Pydantic接受嵌套模型中的附加属性,python,pydantic,Python,Pydantic,我发现下面的反派行为令人惊讶 首先,我创建项,然后使用ItemExtended对其进行扩展,以包含一个附加属性。现在我创建了ItemContainer,它可以获取项目列表 from typing import List from pydantic import BaseModel class Item(BaseModel): thing: int class ItemExtended(Item): extra_thing: int = 456 class ItemC

我发现下面的反派行为令人惊讶

首先,我创建项,然后使用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]
出于某种原因,如果我现在创建一个ItemContainer实例,传入一个ItemExtended,而不是将ItemExtended转换为一个Item,那么它只是被允许的,还有不需要的默认值

i、 e.这个

ItemContainer(items=[ItemExtended(thing=123)])
ItemContainer(items=[ItemExtended(thing=123)])
变成

ItemContainer(items=[ItemExtended(thing=123, extra_thing=456)])
ItemContainer(items=[Item(thing=123)])
有没有一种方法可以严格执行items类型,从而

变成

ItemContainer(items=[ItemExtended(thing=123, extra_thing=456)])
ItemContainer(items=[Item(thing=123)])

您要求执行的操作违反了Python对键入的思考。Pydantic正在做一些直观的事情:你要求它是一个
项目
,事实上,它是一个
项目

如果您想严格要求所提供的内容,请创建一个更严格的子类:

输入导入列表中的

从pydantic导入BaseModel
类别项(基本模型):
事物:int
类别项目(项目):
通过
类项扩展(项):
额外的东西:int=456
类ItemContainer(BaseModel):
项目:列表[项目]

但是,我认为您要求的是自动转换,您可以为其创建一个验证器。

您知道吗?公平点,我可以看到
isinstance(ItemExtended(thing=123),Item)
返回
True
,但在严格执行数据模型的上下文中,它感觉是错误的。