将异步生成器聚合到元组

时间:2018-09-11 23:26:53

标签: 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())

我得到一个

  

TypeError:“ async_generator”对象不可迭代

在执行async for行时。

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

  

异步理解

     

我们建议允许对列表,集合和字典理解使用异步。在等待PEP 525批准之前,我们还可以允许创建异步生成器表达式。

     

示例:

     
      
  • 设置理解:{i在agen()中为i异步};
  •   
  • 列表理解:[i在agen()中为i异步];
  •   
  • dict理解:{i:i ** 2在agen()中为我异步};
  •   
  • 生成器表达式:(i ** 2在agen()中为i异步)
  •   

这是怎么回事,如何将异步生成器聚合到单个tuple中?

1 个答案:

答案 0 :(得分:2)

在PEP摘录中,理解在同一项目符号列表中并排列出,但是生成器表达式与其他表达式有很大的不同。

没有“ tuple理解”之类的东西。 tuple()的参数构成一个异步生成器:

tuple(num async for num in result_generator())

该行等效于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()])