PyCharm 中的类型错误警告

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

我创建了

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)

更新#1

我已将代码更改为:

T = TypeVar('T', bound=Type[BaseModel])


T = TypeVar('T', bound=BaseModel)

现在我在
SpeficRepository
的构造函数中有一些类型警告。

预期类型“Union[BaseModel, Any]”(匹配泛型类型“T”),却得到“Type[SpecificModel]”

python pycharm python-typing
1个回答
2
投票

问题在于

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]"

它会立即告诉您问题是什么。

© www.soinside.com 2019 - 2024. All rights reserved.