gpt4 book ai didi

python:迭代列表或异步生成器

转载 作者:行者123 更新时间:2023-12-04 07:32:18 26 4
gpt4 key购买 nike

由于迭代器是在 python 中引入的,因此总是可以不关心您是在处理迭代器还是列表:

from random import random

def gen_list():
print('gen')
for i in range(10):
yield i

def return_list():
print('return')
return [i for i in range(10)]


if random() > 0.5:
x = gen_list()
else:
x = return_list()

for i in x:
pass
引入 PEP 492 asynchronous iteratorsasync for句法。我看不到为异步迭代器的使用者添加语法的新负担的任何理由。
在我的代码中,我有时处理一个列表(来自缓存),有时处理一个异步生成器:
import asyncio
from random import random

def is_small_and_in_cache():
if random() > 0.5:
print('in fake cache')
return [i for i in range(10)]

async def get_progressively():
print('gen')
for i in range(10):
# e.g. an await here
await asyncio.sleep(0.1)
yield i

async def main():
x = is_small_and_in_cache()
if x is None:
x = get_progressively()

async for i in x:
pass

asyncio.run(main())
但上述失败(一半时间)与 TypeError: 'async for' requires an object with __aiter__ method, got list .
主要问题:如何写这个以便我们可以处理?我应该尝试将列表转换为虚拟异步生成器,还是包装异步生成器以生成列表?
支线任务:是否有任何建议可以摆脱(对我来说显然是非 Python 的) async for构造,即为什么不能使用常规 for循环处理异步生成器? Python3x 是否在可用性方面失去了它的方式?

最佳答案

语法存在于 警告 你知道你的“循环”实际上可能包括挂起你的整个调用,允许其他代码运行,这样你就知道在每次迭代的顶部都有处于一致状态的适当数据。它不会去任何地方。
当然,协程不必挂起,你可以用它来做 包装任何可迭代的琐碎:

async def desync(it):
for x in it: yield x
这比相反的数字更有用,它仍然是异步的,因为它必须收集到一个列表中:
async def gather(ai):
ret=[]
async for x in ai: ret.append(x)
return ret
因为它允许在完全异步的情况下进行适当的交织。

关于python:迭代列表或异步生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67885961/

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