mypy v0.910 rechaza clases de datos abstractas en Python 3.9. Aquí está el ejemplo mínimo reproducible:
from abc import ABC, abstractmethod from dataclasses import dataclass @dataclass class Liquid(ABC): @abstractmethod def drip(self) -> None: passAquí está el mensaje de error:
$ 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)¿Cómo obtengo este código para pasar mypy ?
notas
Deduzco del problema de mypy # 5374 que se trata de un error en mypy , notado por primera vez en 2018 y aún no corregido. Sin embargo, me imagino que las personas deben estar usando mypy con clases de datos abstractas, por lo que debe haber una solución alternativa o una forma correcta de definir o anotar la clase. ¿Qué se recomienda?
La base del mensaje de error parece ser que mypy asume que se puede instanciar cualquier objeto de tipo Type , pero no se pueden instanciar clases abstractas. Este parece ser el error ya que Type se define para significar un objeto de clase, no necesariamente un objeto de clase concreto (es decir, uno que pueda ser instanciado).
Agregar # type: ignore a la línea que contiene class Liquid no bloquea el mensaje de error. Dado que el código no contiene Type[Liquid] , supongo que debe estar en el código generado por dataclass . Type está en desuso en Python 3.9, pero aparentemente el dataclass código de clase de datos aún lo genera.
Agregue # type: ignore a la línea del decorador. Así que en tu caso sería:
from abc import ABC, abstractmethod from dataclasses import dataclass @dataclass # type: ignore class Liquid(ABC): @abstractmethod def drip(self) -> None: passCree una clase de datos como una combinación y deje que la clase ABC herede de ella:
from abc import ABC, abstractmethod from dataclasses import dataclass @dataclass class LiquidDataclassMixin: my_var: str class Liquid(ABC, LiquidDataclassMixin): @abstractmethod def drip(self) -> None: pass Esto también funciona con la verificación de tipo mypy. Recomiendo no usar # type: ignore ya que eso anula el punto de verificación de tipos. Tomado de este número de GitHub .