【问题标题】:Aggregating an async generator to a tuple将异步生成器聚合到元组
【发布时间】:2018-09-13 01:36:25
【问题描述】:

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

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 async for i in agen()};
  • 列表理解:[i async for i in agen()];
  • dict 理解:{i: i ** 2 async for i in agen()};
  • 生成器表达式:(i ** 2 async for i in agen())。

发生了什么,如何将异步生成器聚合到单个 tuple 中?

【问题讨论】:

    标签: python python-asyncio


    【解决方案1】:

    在 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()])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      • 2017-10-22
      • 2019-11-16
      • 2015-08-08
      • 1970-01-01
      相关资源
      最近更新 更多