类型变量..未绑定



我有一个从pydantic.BaseModel继承的基类BaseTemplateData。然后,我想要BaseTemplate类的一个属性,它存储BaseTemplateData的子类的一种类型。我正在执行以下操作,但当我显式地将bound参数传递给TypeVar调用时,我得到了一个mypy错误,说Type variable "file.path.TemplateDataType" is unbound

我还希望有另一个类BaseTemplate2,它的属性不存储类型本身,而是BaseTemplateData的子类的实例。这种方法正确吗?

任何帮助都将不胜感激。谢谢

from typing import Type, TypeVar
from pydantic import BaseModel

class BaseTemplateData(BaseModel):
"""
Base class for all templates.
"""

TemplateDataType = TypeVar("TemplateDataType", bound=BaseTemplateData)

class BaseTemplate(BaseModel):
"""
Template class for email templates
"""
data_model: Type[TemplateDataType]

class BaseTemplate2(BaseModel):
"""
Template class for email templates 2
"""
data_model: TemplateDataType

我对蟒蛇Typing不太熟悉,无法想象你试图用这段代码解决什么问题。但我不明白你为什么需要TemplateDataType

您的期望是:

我想要一个BaseTemplate类的属性,它存储BaseTemplateData 的子类的类型

我也想有另一个类BaseTemplate2,该属性不存储类型本身,而是BaseTemplateData 的子类的实例

好的:

from typing import Type
from pydantic import BaseModel

class BaseTemplateData(BaseModel):
"""
Base class for all templates.
"""

class ChildBaseTemplateData(BaseTemplateData):
"""
Child class for Base class.
"""

class BaseTemplate(BaseModel):
"""
Template class for email templates
"""
data_model: Type[BaseTemplateData]

class BaseTemplate2(BaseModel):
"""
Template class for email templates 2
"""
data_model: BaseTemplateData

a = BaseTemplate()
# it is okay. Because a.data_model is a "type of a child class of BaseTemplateData"
a.data_model = ChildBaseTemplateData
b = BaseTemplate2()
# it is okay too. Because b.data_model is "an instance of a child class of BaseTemplateData"
b.data_model = ChildBaseTemplateData()
c = BaseTemplate2()
# error: Incompatible types in assignment (expression has type "str", variable has type "BaseTemplateData") 
c.data_model = "string"

以下是关于TypeVar的一个很好的解释

TypeVar也与Generics一起使用。

在您的示例中没有Generics

TypeVar的正确使用将类似于:

from typing import Type, TypeVar, Generic
A = TypeVar("A", int, str)
class B(Generic[A]):
pass
# Ok
a = B[int]
# Error: error: Value of type variable "A" of "B" cannot be "float"
b = B[float]

最新更新