我有一个从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]