簡體   English   中英

Mypy + FastAPI response_model

[英]Mypy + FastAPI response_model

我的任務是在我們的 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 Model:

     class NewModel(BaseModel): __root__: Union[Model1, Model2]

某物的Type[]表示該類型的未實例化 class ,而此處的Model1將表示Model1 class 的實例或繼承自Model1的任何實例。

盡管如此,錯誤消息是神秘的。

您使用的是什么python -v 打字是 python 世界中的新事物,python 版本之間的事情也可能發生變化。 如果您升級了mypy版本,最好將python以及 go 一起升級。

另外,您使用的是什么fastapi版本? 我也會嘗試將它升級到最新的0.55.1 Tiangolo 自己寫道,他們在打字時遇到了錯誤

資源

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM