Tengo una aplicación fastapi, que toma "aplicación/json" entre otros tipos de entrada y devuelve "aplicación/json". Tengo un validador de entrada escrito subclasificando el modelo base de BaseModel y me gustaría que acepte algunos casos de entradas que recibo y no genere fastapi.exceptions.RequestValidationError en ellos.
algunas entradas aceptadas ( List[List[float]] ):
{"input_json":[[1.0, 2.0, 3.0, 4.0]]}{"input_json":[[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0]]}Me gustaría hacer que acepte los siguientes casos de entrada:
{"input_json":[[1.0, 2.0, .0, 4.]]} (sin número después del punto decimal, las matrices numpy y las listas de python aceptan tales entradas completando 0 después del período, pero pydantic arroja un error de validación).{"input_json":[1.0, 2.0, 3.0, 4.0]} (no hay lista de listas, solo una lista. Manejaré la forma internamente haciendo numpy.my_array.reshape(-1, 4) , pero quiero que pydantic no generar RequestValidationError y enviar la entrada a mis puntos finales fastapi).{"input_json":[[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0],]} (coma al final de la segunda lista anidada. Las listas numpy y python aceptan tales entradas, pero pydantic no 't.)Así es como se escribe mi clase de validación:
from pydantic import BaseModel, validator class InputResponse(BaseModel): input_json: List[List[float]] @validator("input_json") def check_dimensionality(cls, list_of_lists): for nested_list in list_of_lists: if len(nested_list) != 4: raise ValueError(incomplete_msg) return list_of_lists¿Qué cambios hago para poder aceptar todos esos casos de entrada?
Para eso, puede definir un TypeVar o usar un tipo de unión. En código que parece
from typing import TypeVar, Union T = TypeVar("T", list[list[float]], list[float]) # Option with TypeVar class InputResponse(BaseModel): input_json: T # Option with Union type class InputResponse(BaseModel): input_json: Union[list[list[float]], list[float]]Con respecto al cero que falta después del punto decimal, no he visto ningún problema con eso.