es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error error: Class cannot subclass "StrictBaseModel" (has type "Any") sugiere que mypy no puede detectar el tipo de StrictBaseModel y, por lo tanto, está utilizando Any 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 para StrictBaseModel importándola de la siguiente manera:

    from lib_common.models import StrictBaseModel
    
    class Foo(StrictBaseModel):  # type: ignore  # Ten en cuenta el "ignore" aquí
        bar: str = Field(...)
    

    Luego, puedes agregar una pista de tipo para StrictBaseModel en la definición de Foo de la siguiente manera:

    from lib_common.models import StrictBaseModel
    
    class Foo(StrictBaseModel[Extra]):  # Especifica la pista de tipo aquí
        bar: str = Field(...)
    

    Esto debería resolver el error de mypy y proporcionar una verificación precisa de tipos para Foo.

Comments are closed.