将 mypy 与等待一起使用

Using mypy with await

考虑以下使用 asyncio/async/await 的基本脚本:

import asyncio
from typing import List

async def foo(x) -> int:
    await asyncio.sleep(x / 2)
    return x

async def main() -> List[int]:
    return await asyncio.gather(*(foo(i) for i in (1, 2, 3)))

if __name__ == "__main__":
    print(asyncio.run(main()))

这会运行查找,打印 [1, 2, 3]await asyncio.gather() 生成 List[int].

但是mypy不喜欢这个文件;它提出:

mypytest.py:9: error:

Incompatible types in assignment (expression has type "Tuple[Any, ...]", variable has type "List[int]")

我假设这是因为 typeshed 中的 asyncio.gather() annotations

但是,从用户的角度来看,这仍然有点令人困惑。 我可以做些什么来让 mypy 开心?为什么会存在这种歧义?


关于它的价值,在 mypy 文档的 Typing async/await 部分没有太多内容。

# type: ignore 注释该行或再次转换为 list

return list(await asyncio.gather(*(foo(i) for i in (1, 2, 3))))

此差异已在提交 412b9e7 到 typeshed 存储库时得到解决,它添加了最终的 @overload 来解释潜在的 List 结果。