【问题标题】:asyncio.iscoroutinefunction returns False for asynchronous generatorasyncio.iscoroutine 函数为异步生成器返回 False
【发布时间】:2019-12-15 11:03:15
【问题描述】:

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

async def gen():
    await asyncio.sleep(0.1)
    v = yield 42
    print(v)
    await asyncio.sleep(0.2)

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

print(asyncio.iscoroutinefunction(gen), asyncio.iscoroutine(gen))

我明白了:

False, False

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

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

【问题讨论】:

    标签: python python-3.x python-3.6 python-asyncio


    【解决方案1】:

    你想使用inspect.isasyncgenfunction()(和inspect.isasyncgen()作为调用gen()的结果):

    >>> import inspect
    >>> print(inspect.isasyncgenfunction(gen), inspect.isasyncgen(gen()))
    True True
    

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

    另外,asyncio.iscoroutine*() 函数存在的唯一原因根本是为了支持不能用于创建异步生成器的legacy generator-based @asyncio.coroutine decorator。如果您不需要支持可能仍然使用这些旧代码库(因此早于 Python 3.5),我会坚持使用 inspect.is*() 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 2021-09-05
      • 1970-01-01
      相关资源
      最近更新 更多