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

标签 python python-3.x python-asyncio

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

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/

相关文章:

python - 在python中挂起http POST请求应该怎么做?

python - 当我尝试将数据框转换为 Excel 文件时,列顺序被破坏

python - 与 findall() 一起使用的正则表达式模式来定位 3 个字母的单词

Python闰年计算器(用户选择的两年之间)

MySQL 和 pymysql 一起消失了

python - 部分异步函数未被检测为异步

python - 如何将 ASCII 十六进制代码的路径转换为其等效的 ASCII 字母?

html - CSS 在 apache2 服务器上的 Flask 应用程序中不起作用

python - 使用 asyncio 时无法使用 os.fork() 将多个进程绑定(bind)到一个套接字服务器

python - 有没有办法让我的不和谐机器人在播放完歌曲后断开与语音 channel 的连接?