在尝试汇总异步生成器的结果时,如下所示:
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
中?
答案 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()])