将异步生成器聚合为元组

car*_*ver 7 python python-asyncio

在尝试从异步生成器聚合结果时,如下所示:

async def result_tuple():
    async def result_generator():
        # some await things happening in here
        yield 1
        yield 2
    return tuple(num async for num in result_generator())
Run Code Online (Sandbox Code Playgroud)

我得到一个

类型错误:“async_generator”对象不可迭代

执行该async for行时。

PEP 530似乎暗示它应该是有效的:

异步理解

我们建议允许将 async 用于内部列表、集合和字典推导式。等待 PEP 525 批准,我们还可以允许创建异步生成器表达式。

例子:

  • 集合理解:{i async for i in agen()};
  • 列表理解:[i async for i in agen()];
  • 字典理解:{i: i ** 2 async for i in agen()};
  • 生成器表达式:(i ** 2 async for i in agen())。

发生了什么,我如何将异步生成器聚合成一个tuple

car*_*ver 5

在 PEP 摘录中,推导式在同一个项目符号列表中并排列出,但生成器表达式与其他推导式非常不同。

没有所谓的“tuple理解”。tuple()使异步生成器的参数:

tuple(num async for num in result_generator())
Run Code Online (Sandbox Code Playgroud)

该行相当于tuple(result_generator())。然后元组尝试同步迭代生成器并引发TypeError.

但是,正如问题所预期的那样,其他理解将起作用。因此可以通过首先聚合到列表来生成元组,如下所示:

async def result_tuple():
    async def result_generator():
        # some await things happening in here
        yield 1
        yield 2
    return tuple([num async for num in result_generator()])
Run Code Online (Sandbox Code Playgroud)