当从 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
字段之间的类型不匹配。
我相信这将有助于解决问题。
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]