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选择感到满意。
我想编写使用 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选择感到满意。