簡體   English   中英

asyncio 事件循環的獨立於平台的 mypy 類型注釋是什么?

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

我想編寫使用mypy並在多個平台上工作的asyncio類型的代碼。 具體來說,我經常有顯式綁定到事件循環的類和方法。 我想為事件循環提供類型注釋。

當我檢查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實際上是事件循環的正確的、獨立於操作系統的定義。

您可以在此處找到有問題的源代碼。

所以我認為,您實際上是對的,並且應該對這種類型提示選擇感到滿意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM