gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 19:01:49 32 4
gpt4 key购买 nike

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

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] 列表.

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

如果没有,我可以创建一个单行的 ad-hoc 异步生成器来简单地生成这个 item 吗?

最佳答案

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

有了这个助手,下面的操作就可以工作了:

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

If not, can I create a one-liner ad-hoc async generator that simply yields this one 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 语句,这使得它不适合您的用例。

关于python - 如何使用相同的 for 语句迭代同步迭代器和异步生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51852691/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com