Pydantic 模型继承和子类列表的类型不兼容问题

问题描述 投票:0回答:1

当从 Pydantic 模型继承并尝试使用子类列表覆盖参数时,mypy 会抛出类型错误。基类将参数定义为父类的列表,但是当尝试用子类的列表覆盖它时,mypy 认为它不兼容。

失败的例子:

from pydantic import BaseModel

class Name(BaseModel):
    data: str

class EnglishName(Name):
    data: str

class Animal(BaseModel):
    name: list[Name]

class AmericaAnimal(Animal):
    name: list[EnglishName]  # Incompatible types in assignment (expression has type "list[EnglishName]", base class "Animal" defined the type as "list[Name]")

相比之下,以下示例通过了:

from pydantic import BaseModel

class Name(BaseModel):
    data: str

class EnglishName(Name):
    data: str

class Animal(BaseModel):
    name: Name

class AmericaAnimal(Animal):
    name: EnglishName

鉴于 EnglishName 继承自 Name,使用列表时类型应该兼容,但使用子类列表覆盖时 mypy 则不是这种情况。

我尝试使用

Name
类型的
data
字段定义基本 Pydantic 模型
str
。然后,我创建了一个继承于
EnglishName
的子类
Name
。接下来,我定义了另一个基本 Pydantic 模型
Animal
,其中字段
name
作为
Name
对象的列表。但是,当我尝试在子类
AmericaAnimal
中覆盖此字段以成为
EnglishName
对象列表时,我希望该类型是兼容的,因为
EnglishName
Name
的子类。相反,我遇到了来自 mypy 的类型不兼容错误。

预期行为: 由于

AmericaAnimal
EnglishName
之间的继承关系,我希望
name
接受
Name
对象列表作为其
EnglishName
字段。

实际行为: Mypy 引发“赋值中的类型不兼容”错误,指示

name
Animal
字段与
name
的覆盖
AmericaAnimal
字段之间的类型不匹配。

python-3.x mypy pydantic
1个回答
0
投票

我相信这将有助于解决问题。

from typing import List
from pydantic import BaseModel


class Name(BaseModel):
    data: str

class EnglishName(Name):
    data: str

class Animal(BaseModel):
    name: List[Name]

class AmericaAnimal(Animal):
    name: List[EnglishName]
© www.soinside.com 2019 - 2024. All rights reserved.