如何使用相同的for语句迭代同步迭代器和异步生成器?

2024-03-29 07:55:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的同步代码:

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的一行ad-hoc异步生成器吗?


Tags: 方法代码in列表forgetasyncif
1条回答
网友
1楼 · 发布于 2024-03-29 07:55:15

Is there a way of iterating over a variable that could be a normal iterator or an async generator?

不能没有适配器,你必须自己提供。例如:

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

有了该助手,以下操作将起作用:

^{pr2}$

If not, can I create a one-liner ad-hoc async generator that simply yields this one item?

虽然PEP 530定义了异步生成器表达式,但它们在这里没有用处,因为它们需要异步迭代器进行迭代,而这正是我们要创建的。在

虽然从技术上讲不是一个单行线,但一个简单而简短的选择是创建一个生成器并立即实例化它:

^{3}$

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

async def aiter_once(val):
    yield val

并编写items = aiter_once(item),但这同样要求在代码中的某个地方定义aiter_once助手。在

^{}包值得一提的是它的流操作符集合,包括^{},它创建一个产生单个值的异步流。但是,它需要一个with语句来围绕for循环,这使得它对于您的用例来说是不符合逻辑的。在

相关问题 更多 >