如何在同一个for语句中迭代同步迭代器和异步生成器?

3

I had this simple sync code:

if item:
    items = [item]
else:
    items = get_items()
for i in items:
    # do something

现在,get_items是异步生成器。使用for i in items无法与异步生成器配合使用,而async for i in items无法迭代我的[item]列表。
如果没有其他方法可以迭代可能是普通迭代器或异步生成器的变量,请问是否可以创建一个一行代码的临时异步生成器,仅产生这个item
1个回答

1

有没有一种方法可以迭代一个可能是普通迭代器或异步生成器的变量?

没有,除非你自己提供一个适配器。例如:

async def as_aiter(it):
    for val in it:
        yield val

有了这个助手,以下内容将起作用:
if item:
    items = as_aiter([item])
else:
    items = get_items()
async for i in items:
    # do something

如果不行,我能否创建一个一行的即席异步生成器,只需简单地产生这个item吗?
虽然PEP 530定义了异步生成器表达式,但它们在这里并不有用,因为它们需要一个异步迭代器来迭代,而这正是我们要创建的。
虽然技术上不是一行代码,但一个简单而短的选项是创建一个生成器并立即实例化它:
if item:
    async def gen_item(): yield item
    items = gen_item()
else:
    items = get_items()

很容易将其概括为一个助手,例如:

async def aiter_once(val):
    yield val

并且编写 items = aiter_once(item),但这需要在代码中定义 aiter_once 辅助程序。

aiostream 包值得一提,因为它拥有很好的流操作符集合,包括 aiostream.stream.just,它创建了一个异步流,产生单个值。然而,它需要在 for 循环周围使用 with 语句,这使得它对您的使用情况不舒适。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接