asyncio 事件循环的平台无关的 mypy 类型注释是什么?

问题描述 投票:0回答:1

我想编写使用

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

当我检查 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())

但是您会注意到,我必须在

# type: ignore
导入中包含
_UnixSelectorEventLoop
标签,因为
asyncio.unix_events
没有类型存根。我也犹豫是否要导入一个打算私有的方法,如类名开头的下划线所示。

作为替代方案,我可以使用

AbstractEventLoop
作为类型:

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

这成功通过了 mypy 类型检查。我犹豫是否使用

AbstractEventLoop
作为我的类型,因为它是一个抽象类型。

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

python python-asyncio python-typing mypy
1个回答
10
投票

如果您查看 CPython 源代码,

AbstractEventLoop
实际上是正确的、独立于操作系统的事件循环定义。

您可以在这里找到有问题的源代码。

所以我认为,你实际上是对的,并且应该对这种类型提示选择感觉良好。

© www.soinside.com 2019 - 2024. All rights reserved.