mypy v0.910 拒绝 Python 3.9 中的抽象数据类。这是最小的可重现示例:
from abc import ABC, abstractmethod
from dataclasses import dataclass
@dataclass
class Liquid(ABC):
@abstractmethod
def drip(self) -> None:
pass
这是错误消息:
$ mypy --python-version 3.9 so.py
so.py:4: error: Only concrete class can be given where "Type[Liquid]" is expected
Found 1 error in 1 file (checked 1 source file)
如何让此代码通过mypy?
笔记
我从mypy 问题 #5374中得知这是mypy中的一个错误,于 2018 年首次发现,但仍未得到纠正。不过,我认为人们必须将mypy与抽象数据类一起使用,因此必须有一种解决方法或正确的方法来定义或注释该类。推荐什么?
错误消息的基础似乎是mypy假设Type
可以实例化任何类型的对象,但不能实例化抽象类。这似乎是错误,因为Type
它被定义为一个类对象,不一定是一个具体的类对象(即可以实例化的对象)。
添加# type: ignore
到包含的行class Liquid
不会阻止错误消息。由于代码中不包含Type[Liquid]
,我想它一定是在生成的代码中dataclass
。Type
在 Python 3.9 中已弃用,但显然dataclass
代码生成器仍会生成它。