如何向添加类型批注异步Tas

2024-04-25 23:58:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个代码是这样的:

import asyncio
from typing import List

def some_callback(result):
    print(result)

async def b() -> List[int]:
    return [1, 2, 3]

async def a() -> None:
    search = asyncio.ensure_future(b())
    search.add_done_callback( some_callback)
    await search

loop = asyncio.get_event_loop()
loop.run_until_complete(a())
loop.close()

我试图向some_callback函数添加类型注释,但是我不能完全理解如何注释result变量。应该是Coroutine?或者Awaitable?在

当我使用mypyreveal_type时,result变量的输出是Any。在

该程序的输出为:

^{pr2}$

我应该如何正确记录此功能?在


Tags: 代码fromimportloopasynciotypingsearchasync
1条回答
网友
1楼 · 发布于 2024-04-25 23:58:04

通常,只需打印变量的类型,就可以获得某些变量的基本注释:

def some_callback(result):
    print(type(result))

{{cd2>看起来像是一个类型:

^{pr2}$

但正如您所指出的,我们还可以使用比Task更抽象的类型Awaitable,因为TaskAwaitable的(子类):

print(issubclass(asyncio.Task, typing.Awaitable))  # True

我们的选择现在缩小到Task或者它的一个父类,比如Awaitable(包括最极端的情况-Any,它是任何类的父类,mypy已经向您建议过)。在

add_done_callbackFuturemethod,根据文档将接收未来对象作为它的参数。它不会是任何类型的Awaitable(像协同程序),而只是Future或者它的一些子类,比如{}。在

在选择类型注释时,对于函数可以接受的参数(工作正常)最抽象,对于它可以返回的内容最具体是有意义的。所以在FutureTask之间选择,我更喜欢Future(假设您不打算只使用Task特定的属性)。根据这个逻辑,最终答案是:

def some_callback(result: asyncio.Future):
    print(result)

这听起来有点复杂和耗时,但是一旦你有了想法,你就可以更快地选择注释了。在

相关问题 更多 >