Se me asignó la tarea de manejar la actualización de Mypy 0.770 a 0.870 en nuestro proyecto FastAPI, y esto produjo un error que no puedo comprender. Mi punto final puede devolver dos modelos diferentes en función de alguna condición, y esto se denotó de la siguiente manera el decorador de punto final:
@router.get("/", response_model=Union[Model1, Model2])
Mypy 0.870 ahora se queja de esto, afirmando que
Argument "response_model" to "get" of "APIRouter" has incompatible type "object"; expected "Optional[Type[Any]]"
Establecerlo en tipos únicos, como Model1
o incluso str
elimina el error. Any
sin embargo, no funciona.
Ahora, al examinar el método get
, veo que el argumento response_model
se escribe como Type[Any]
, que supongo que debe ser un puntero.
¿Cómo puedo definir modelos de devolución no simples para mi API y hacer feliz a Mypy?
editar: traté de reproducir el problema en un marco más pequeño, pero no pude. El siguiente código funciona bien:
from typing import Any, Type, Union def test1(var, response_model: Type[Any]): print(f"Accepted Type[Any], {var}") def test2(var, response_model: Union[dict, set]): print(f"Accepted Union, {var}") def main(): test1('test1', response_model=Union[dict, set]) test2('test2', response_model=Union[dict, set]) if __name__ == '__main__': main()
Este es un problema de compatibilidad introducido en las versiones más recientes de mypy. Hay un problema abierto en Github sobre este tema: https://github.com/tiangolo/fastapi/issues/2279
En la discusión, proporcionan las siguientes soluciones:
Usando un enfoque diferente para crear un alias de tipo:
NewModel = TypeVar('NewModel',Model1,Model2)
Creando un nuevo modelo Pydantic:
class NewModel(BaseModel): __root__: Union[Model1, Model2]
Type[]
of something significa una clase no instanciada de este tipo, mientras que Model1
aquí significará una instancia de una clase Model1
o una instancia de cualquier cosa que herede de Model1
.
No obstante, el mensaje de error es enigmático.
¿Qué python -v
estás usando? Escribir es algo nuevo en un mundo de python y las cosas también pueden cambiar entre las versiones de python. Si superó la versión de mypy
, podría ser bueno actualizar python
, ya que van juntos.
Además, ¿qué versión de fastapi
estás usando? También intentaría actualizarlo a la última versión, 0.55.1
. El propio Tiangolo escribió que han tenido un error al escribir