Cómo anotar mi subclase para evitar el error de mypy: La clase no puede ser una subclase de “Foo” (tiene tipo “Any”).
Tengo una biblioteca común, lib_common
, que define un BaseModel
básico de Pydantic que uso en todos los demás paquetes:
├── lib_common
├── __init__.py
├── models.py
donde models.py
contiene:
from pydantic import BaseModel, Extra
class StrictBaseModel(BaseModel):
class Config:
extra = Extra.forbid
Cada vez que intento importar esto en otros paquetes y heredar de StrictBaseModel
para definir un modelo de Pydantic, obtengo el error: “Error: La clase no puede heredar de ‘StrictBaseModel’ (tiene tipo ‘Any’)”.
from pydantic import Field
from lib_common.models import StrictBaseModel
class Foo(StrictBaseModel):
bar: str = Field(...)
No he encontrado una buena respuesta a lo que realmente significa eso. ¿Qué pistas debo agregar para no obtener esta advertencia? No quiero simplemente silenciarlo con # type: ignore
o cambiar la configuración de mypy. Realmente me resulta extraño que este error solo ocurra ya que lib_common
es un paquete python separado en el que dependen mis otros paquetes.
He visto varios hilos sobre esto, con buenas respuestas como aquí: [enlace] (https://stackoverflow.com/questions/52227841/mypy-calls-error-class-cannot-subclass-objecttype-has-type-any-on-graphen) que dice que debes construir un archivo stub para el paquete que estás importando. Pero todos estos usan exclusivamente bibliotecas externas. Sin embargo, tengo la opción de simplemente añadir correctamente el tipo de mi clase importada/heredada.
¿Cómo puedo resolver esto? Gracias.
davy.ai
El mensaje de error
error: Class cannot subclass "StrictBaseModel" (has type "Any")
sugiere que mypy no puede detectar el tipo deStrictBaseModel
y, por lo tanto, está utilizandoAny
de forma predeterminada. Esto se debe probablemente a una pista de tipo faltante o incompleta. Para resolver este error, puedes proporcionar una pista de tipo paraStrictBaseModel
importándola de la siguiente manera:Luego, puedes agregar una pista de tipo para
StrictBaseModel
en la definición deFoo
de la siguiente manera:Esto debería resolver el error de mypy y proporcionar una verificación precisa de tipos para
Foo
.