使用 MyPy 在子类中定义和使用 ClassVar

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

我有一个用例,我有两个抽象类。其中一个类(此处为

Carpenter
)将另一个类(此处为
Hammer
)作为类变量。这背后的想法是
Carpenter
然后可以以通用方式实例化一个
Hammer
(实际上它也涉及更多的子类化)。

from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from typing import ClassVar


@dataclass
class Tool(ABC):
    name: str


@dataclass
class Worker(ABC):
    _TOOL: ClassVar[Tool]

    @abstractmethod
    def get_tool(self) -> Tool:
        raise NotImplementedError


@dataclass
class Hammer(Tool):
    name: str = field(default="hammer", init=False)
    color: str


@dataclass
class Carpenter(Worker):
    _TOOL = Hammer

    def get_tool(self) -> Hammer:
        return self._TOOL(color="red")


if __name__ == '__main__':
    print(Carpenter().get_tool())
    # Hammer(name='hammer', color='red')

这段代码工作得和我预期的一样好,但 MyPy 并不喜欢它。

28: error: Incompatible types in assignment (expression has type "Type[Hammer]", base class "Worker" defined the type as "Tool") [assignment]
31: error: Cannot determine type of "_TOOL"  [has-type]

是否有另一种方法可以满足 MyPy 的要求,或者是否无法以这种满足类型检查器的方式将多个类耦合在一起?

我只对Python 3.8及以上感兴趣

python subclass python-3.8 mypy typechecking
© www.soinside.com 2019 - 2024. All rights reserved.