我创建了
BaseRepository
类,我在特定存储库中继承了该类。
当调用 update
的 RecipeRepository
方法时,我收到一些奇怪的警告。
警告: 预期类型“SpecificModel”(匹配泛型类型“T”),却得到“SpecificModel”
我做错了什么?
- 模型
from typing import Type, TypeVar, Generic
class BaseModel:
def update(self, *args, **kwargs):
return self
class SpecificModel(BaseModel):
name: str
- 存储库
T = TypeVar('T', bound=BaseModel)
class BaseRepository(Generic[T]):
def __init__(self, model: T):
self._model = model
def update(self, record: T, *args, **kwargs):
return record.update(*args, **kwargs)
class SpecificRepository(BaseRepository[SpecificModel]):
def __init__(self):
super().__init__(SpecificModel)
- 服务
class SpecificService:
def __init__(self, repository: SpecificRepository):
self._repository = repository
def update_name(self, record: SpecificModel, name: str):
# When hovering over `record` I get the warning
self._repository.update(record, name)
我已将代码更改为:
T = TypeVar('T', bound=Type[BaseModel])
T = TypeVar('T', bound=BaseModel)
。SpeficRepository
的构造函数中有一些类型警告。
预期类型“Union[BaseModel, Any]”(匹配泛型类型“T”),却得到“Type[SpecificModel]”
问题在于
T
的定义。而不是
T = TypeVar('T', bound=Type[BaseModel])
你想要
T = TypeVar('T', bound=BaseModel)
最终,您希望
T
代表 BaseModel
及其子类,而不是 type(BaseModel)
(即 type
)及其子类。
要诊断此问题和其他类似问题,您可以使用更完整的静态类型检查器,例如 mypy。在这种情况下,mypy 在定义中给出了更多信息性错误
SpecificRepository
:
error: Type argument "module.SpecificModel" of "BaseRepository" must be a subtype of "Type[module.BaseModel]"
它会立即告诉您问题是什么。