aiter() 是 Python 3.10 版本中的一个新函数。它返回一个异步可迭代对象的异步迭代器。
语法
aiter(async_iterable)
其中 async_iterable 是一个异步可迭代对象,相当于调用 x.__aiter__()。
注意:与 iter() 不同,aiter() 没有两个参数的版本。
- aiter() 和 anext() 调用对象的 __aiter__() 和 __anext__()
- 它们本质上是 iter() 和 next() 的异步等价物。 在大多数情况下,很少需要直接使用新的内置函数, 我们可以直接用async for代替。 async for 循环已经隐式调用了类的 __aiter__ 和 __anext__ 方法。
应用
如果您正在编写的代码以某种方式与异步迭代器交互,那么您只需要显式使用 aiter 和 anext,而这种方式不被 async for 循环直接支持。 例如,这是一个异步生成器,它从给定的可迭代对象中产生成对的值:
async def pairwise(aiterable, default=None):
# 获取对迭代器的引用
ait = aiter(aiterable)
# 得到一个额外的值,产生一个 2 元素元组
async for x in ait:
yield x, await anext(ait, default)
如果您在 main 函数中循环使用 pairwise(AIter(10)),您会发现它现在打印数字元组,例如 finally (0, 1)。 在每个元组之前,您将看到由迭代器类打印的两组开始行和结束行,一组用于最终出现在配对结果中的每个值。
示例
import asyncio
async def numbers(nums):
for i in range(nums):
yield i
await asyncio.sleep(0.5)
# 隐式使用
[i async for i in numbers(10) if i % 2 == 0]
# 显式使用
[i async for i in aiter(numbers(10)) if i % 2 == 0]
# [0, 2, 4, 6, 8]
a = aiter(numbers(10))
dir(a)
'''
['__aiter__',
'__anext__',
'__class__',
...
'''
在上面的代码中,numbers() 函数是一个异步生成器,它为异步列表理解生成值。