[英]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.