asyncio.iscoroutinefunction 对于异步生成器返回 False

Per*_*nce 7 python python-3.x python-asyncio python-3.6

以下异步生成器代码直接取自 PEP525:

async def gen():
    await asyncio.sleep(0.1)
    v = yield 42
    print(v)
    await asyncio.sleep(0.2)
Run Code Online (Sandbox Code Playgroud)

但是,当我调用(使用 python3.6)时:

print(asyncio.iscoroutinefunction(gen), asyncio.iscoroutine(gen))
Run Code Online (Sandbox Code Playgroud)

我得到:

False, False
Run Code Online (Sandbox Code Playgroud)

为什么异步生成器无法识别为协程函数?

还有其他方法可以将其识别为协程函数吗?

Mar*_*ers 5

您想要使用inspect.isasyncgenfunction()(以及inspect.isasyncgen()调用的结果gen()):

>>> import inspect
>>> print(inspect.isasyncgenfunction(gen), inspect.isasyncgen(gen()))
True True
Run Code Online (Sandbox Code Playgroud)

异步函数和异步生成器函数之间没有类型层次结构关系。

asyncio.iscoroutine*()此外,这些函数存在的唯一原因是支持遗留的基于生成器的@asyncio.coroutine装饰器,它不能用于创建异步生成器。如果您不需要支持可能仍在使用这些功能的旧代码库(因此早于 Python 3.5),我只会坚持使用这些inspect.is*()函数。