我有一个fastapi应用程序,它接收"application/json";在其它输入类型中;application/json";。我有一个输入验证器,它对pydantic的BaseModel
进行了子类化,我想让它接受一些我确实接收到的输入,而不是在它们上生成fastapi.exceptions.RequestValidationError
。
一些可接受的输入(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]]}
我想让它接受以下输入情况:
{"input_json":[[1.0, 2.0, .0, 4.]]}
(小数点后没有数字,numpy数组和python列表通过在句点后填充0来接受此类输入,但pydantic抛出验证错误。({"input_json":[1.0, 2.0, 3.0, 4.0]}
(没有列表列表,只是一个列表。我将在内部处理numpy.my_array.reshape(-1, 4)
的形状,但我希望pydantic不生成RequestValidationError
,并将输入发送到我的fastapi端点。({"input_json":[[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0],]}
(第二个嵌套列表末尾的逗号。numpy和python列表都接受这样的输入,但pydantic不接受。(
以下是我的validaton类的编写方式:
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
为了能够接受所有这些输入案例,我做了哪些更改?
为此,您可以定义TypeVar
或使用联合类型。在看起来像的代码中
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]]
关于小数点后缺失的零,我没有看到任何问题。