python:内置函数aiter异步迭代器

  • Post author:
  • Post category:python


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() 函数是一个异步生成器,它为异步列表理解生成值。