我想编写使用
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 类型检查的替代类型签名?
如果您查看 CPython 源代码,
AbstractEventLoop
实际上是正确的、独立于操作系统的事件循环定义。
您可以在这里找到有问题的源代码。
所以我认为,你实际上是对的,并且应该对这种类型提示选择感觉良好。