将 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
结果。
考虑以下使用 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
结果。