我有这个简单的同步代码:
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/