我有一个代码如下:
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
我该如何正确记录此功能?
答案 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;我们向你求婚。)
Any
是add_done_callback
&#39; method根据文档将接收未来对象作为其参数。它不会是任何类型Future
(如协程),但只有Awaitable
或其中的一些子类,如Future
。
当谈到选择类型注释时,对于你的函数可以接受什么作为参数(正常工作)以及最具体的关于它可以返回的东西是有意义的。因此,在Task
和Future
之间进行选择,我更希望Task
(假设您不打算使用Future
特定的attrs)。根据这个逻辑,最终答案是:
Task
听起来有点复杂和耗时,但一旦你明白了,你就能更快地选择注释。