FastAPI 的 Depends() 会导致 mypy 中出现"Incompatible default for argument"错误



我有这个示例代码。

def get_test(q: str) -> str:
return 'str str str' + q

@router_user.put(
"/", response_model=schemas.UpdateUserRequest, tags=["User and Authentication"]
)
async def update_user(
data: schemas.UpdateUserRequest,
q: str = Depends(logic.get_test),
db: AsyncSession = Depends(get_db),
user: models.User = Depends(logic.get_curr_user_by_token),
):
print(q)

当我用mypy检查它时,我总是得到一个错误


app/api/user/router.py:74: error: Incompatible default for argument "q" (default has type "Depends", argument has type "str")  [assignment]

看起来您使用了不正确的导入。

我已经清理了您的代码示例并添加了导入,下面的代码确实通过了mypy:

from fastapi import APIRouter, Depends

def get_test(q: str) -> str:
return "str str str" + q

router_user = APIRouter()

@router_user.put("/")
async def update_user(
q: str = Depends(get_test)
) -> None:
print(q)

但是,如果我用代替进口

from fastapi import APIRouter
from fastapi.params import Depends

然后我得到了你从mypy那里得到的同样的错误。

我猜您的IDE错误地完成了从fastapi.params而不是直接从fastapi的导入。如果你查看官方文档,你会发现Depends应该直接从fastapi导入。

为什么会发生这种情况

params.Depends是这里定义的一个类。但是,如果直接使用它,那么每当编写类似x: str = Depends(...)的内容时,都会出现类型错误,因为params.Depends类与str不兼容。我们真正想要的是mypy忽略Depends()的类型,并假设它与任何类型都兼容。

这就是为什么fastapi中的Depends实际上是围绕params.Depends的包装函数,定义为返回Any

查看您的代码,您的get_curr_user_by_token似乎返回models.UserDepends本身不会改变结果的类型,所以您只需要使用Depends内部的东西返回的结果。

q: models.User = Depends(logic.get_curr_user_by_token),

相关内容

  • 没有找到相关文章

最新更新