gpt4 book ai didi

python - Mypy + FastAPI response_model

转载 作者:行者123 更新时间:2023-12-04 11:40:32 25 4
gpt4 key购买 nike

我的任务是在我们的 FastAPI 项目中处理从 Mypy 0.770 到 0.870 的更新,这产生了一个我无法完全理解的错误。我的端点可以根据某些条件返回两个不同的模型,这在 endpont 装饰器中表示如下:

@router.get("/", response_model=Union[Model1, Model2])

Mypy 0.870 现在提示这个,指出
Argument "response_model" to "get" of "APIRouter" has incompatible type "object"; expected "Optional[Type[Any]]"

设置为单一类型,如 Model1甚至 str删除错误。 Any但是,不起作用。

现在,查看 get方法,我看到了 response_model参数输入为 Type[Any] ,我认为它必须是一个指针。

如何为我的 API 定义非简单的返回模型,并使 Mypy 开心?

编辑:我试图在较小的框架中重现该问题,但不能。以下代码工作正常:
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()

最佳答案

这是在较新版本的 mypy 中引入的兼容性问题。
Github 上有一个关于这个主题的公开问题:
https://github.com/tiangolo/fastapi/issues/2279
在讨论中,他们提供了以下解决方法:

  • 使用不同的方法创建类型别名:NewModel = TypeVar('NewModel',Model1,Model2)
  • 创建一个新的 Pydantic 模型:
    class NewModel(BaseModel):
    __root__: Union[Model1, Model2]
  • 关于python - Mypy + FastAPI response_model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62264787/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com