[英]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.