asyncio 事件循环的独立于平台的 mypy 类型注释是什么?

What is the platform-independent mypy type annotation for asyncio event loop?

我想编写使用 asyncio 并在多个平台上工作的 mypy 类型的代码。具体来说,我经常有 classes 和显式绑定到事件循环的方法。我想为事件循环提供类型注释。

当我在 Linux 上检查 asyncio 事件循环的类型时,我得到:

>>> import asyncio
>>> type(asyncio.get_event_loop())
<class 'asyncio.unix_events._UnixSelectorEventLoop'>

此类型显然与 Unix/Linux 平台相关联。

现在,我可以编写代码来显式指定事件循环的类型:

import asyncio
from asyncio.unix_events import _UnixSelectorEventLoop  # type: ignore
def func(loop: _UnixSelectorEventLoop) -> None:
    print(loop)
func(asyncio.get_event_loop())

但是您会注意到我必须在 _UnixSelectorEventLoop 导入中包含一个 # type: ignore 标记,因为 asyncio.unix_events 没有类型存根。我也对导入一个打算私有的方法犹豫不决,正如 class 名称开头的下划线所示。

作为替代方案,我可以使用 AbstractEventLoop 作为类型:

import asyncio
def func(loop: asyncio.AbstractEventLoop) -> None:
    print(loop)
func(asyncio.get_event_loop())

这成功通过了 mypy 类型检查。我对使用 AbstractEventLoop 作为我的类型犹豫不决,因为它是一个抽象类型。

是否有跨平台工作的替代类型签名,不需要使用抽象 class 定义,并通过 mypy 类型检查?

如果你看CPython源码,AbstractEventLoop其实是正确的,OS事件循环的独立定义。

您可以找到问题的源代码here

所以我认为,你其实是对的,应该对这个type-hint选择感到满意。