如何将类型注释添加到asyncio.Task

时间:2017-11-21 15:02:37

标签: python python-3.x python-asyncio type-annotation

我有一个代码如下:

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

当我使用reveal_type的{​​{1}}时,mypy变量的输出为result

该程序的输出是:

Any

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

1 个答案:

答案 0 :(得分:3)

通常只需打印一个变量即可获得某个变量的基本注释:

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

虽然它会显示一些内部<class '_asyncio.Task'>类型,但看起来我们可以将其视为常规asyncio.Task

def some_callback(result):
    print(type(result) is asyncio.Task)  # True

但正如您所指出的,我们也可以使用更为抽象的类型,然后使用Task Awaitable,因为Task是({1}}的子类:

Awaitable

我们的选择现在缩小到print(issubclass(asyncio.Task, typing.Awaitable)) # True 或其中一个父类,例如Task(包括最极端的情况 - Awaitable,它是任何类的父类,以及mypy&#39;我们向你求婚。)

Anyadd_done_callback&#39; method根据文档将接收未来对象作为其参数。它不会是任何类型Future(如协程),但只有Awaitable或其中的一些子类,如Future

当谈到选择类型注释时,对于你的函数可以接受什么作为参数(正常工作)以及最具体的关于它可以返回的东西是有意义的。因此,在TaskFuture之间进行选择,我更希望Task(假设您不打算使用Future特定的attrs)。根据这个逻辑,最终答案是:

Task

听起来有点复杂和耗时,但一旦你明白了,你就能更快地选择注释。