Python aiter 函数
上次修改时间:2025 年 4 月 11 日
这篇综合指南探讨了 Python 的 aiter 函数,该函数返回一个用于异步迭代的异步迭代器。我们将涵盖基本用法、自定义异步迭代器和实际示例。
基本定义
aiter 函数返回一个异步迭代器对象。 它是内置 iter 函数的异步等效项。 它在 Python 3.10 中引入,适用于实现 __aiter__ 的对象。
主要特征:在 async for 循环中使用,需要一个异步可迭代对象,返回一个异步迭代器。 它通常与 anext 一起用于异步迭代。
基本异步迭代
这是一个使用异步生成器的简单示例,展示了 aiter 如何与基本异步迭代一起工作。
async def async_gen():
for i in range(3):
yield i
await asyncio.sleep(0.1)
async def main():
ag = async_gen()
ait = aiter(ag)
while True:
try:
val = await anext(ait)
print(val)
except StopAsyncIteration:
break
asyncio.run(main())
此示例显示了基本异步迭代。 async_gen 异步生成值。 aiter 获取异步迭代器,anext 检索值。
循环持续进行,直到引发 StopAsyncIteration,类似于常规迭代,但使用 async/await 语法。
自定义异步迭代器
您可以通过实现 __aiter__ 来创建自定义异步迭代器。 此示例显示了一个简单的异步计数器。
class AsyncCounter:
def __init__(self, stop):
self.stop = stop
self.current = 0
def __aiter__(self):
return self
async def __anext__(self):
if self.current >= self.stop:
raise StopAsyncIteration
await asyncio.sleep(0.1)
self.current += 1
return self.current - 1
async def main():
async for i in AsyncCounter(3):
print(i)
asyncio.run(main())
AsyncCounter 类实现了 __aiter__ 和 __anext__ 以支持异步迭代。 调用 aiter 时,它将返回此对象。
当您需要比异步生成器提供更多地控制异步迭代时,此模式非常有用。
异步可迭代协议
此示例演示了具有单独迭代器和可迭代类的完整异步可迭代协议。
class AsyncIterable:
def __init__(self, data):
self.data = data
def __aiter__(self):
return AsyncIterator(self.data)
class AsyncIterator:
def __init__(self, data):
self.data = data
self.index = 0
async def __anext__(self):
if self.index >= len(self.data):
raise StopAsyncIteration
await asyncio.sleep(0.1)
item = self.data[self.index]
self.index += 1
return item
async def main():
ait = aiter(AsyncIterable([1, 2, 3]))
print(await anext(ait)) # 1
print(await anext(ait)) # 2
print(await anext(ait)) # 3
asyncio.run(main())
这显示了具有单独可迭代和迭代器类的完整协议。 AsyncIterable 返回一个新的 AsyncIterator。
这种分离允许对相同数据进行多次独立迭代,类似于常规可迭代对象的工作方式。
错误处理
当与非异步可迭代对象一起使用时,aiter 函数会引发 TypeError。 此示例显示了正确的错误处理。
async def main():
try:
ait = aiter([1, 2, 3]) # Regular list is not async iterable
except TypeError as e:
print(f"Error: {e}") # 'list' object is not async iterable
class NoAiter:
pass
try:
ait = aiter(NoAiter())
except TypeError as e:
print(f"Error: {e}") # 'NoAiter' object is not async iterable
asyncio.run(main())
这些示例演示了 aiter 在无效类型上的行为。 常规可迭代对象和没有 __aiter__ 的对象会引发错误。
要使一个类与 aiter 一起使用,请如前面的示例所示实现 __aiter__。
实际示例:异步数据获取
此示例显示了 aiter 的实际用例,用于从多个源进行异步数据获取。
async def fetch_data(url):
# Simulate network request
await asyncio.sleep(0.2)
return f"Data from {url}"
class AsyncDataFetcher:
def __init__(self, urls):
self.urls = urls
def __aiter__(self):
self.index = 0
return self
async def __anext__(self):
if self.index >= len(self.urls):
raise StopAsyncIteration
url = self.urls[self.index]
self.index += 1
return await fetch_data(url)
async def main():
fetcher = AsyncDataFetcher([
"api.example.com/1",
"api.example.com/2",
"api.example.com/3"
])
async for data in fetcher:
print(data)
asyncio.run(main())
这演示了一个真实世界的用例,其中 aiter 启用了异步数据处理。 获取器逐个从 URL 检索数据。
异步迭代模式允许有效的 I/O 绑定操作,而不会阻塞事件循环。
最佳实践
- 用于异步迭代: 优先使用
aiter而不是手动异步迭代 - 实现 __aiter__: 对于自定义异步可迭代类型
- 分离可迭代对象/迭代器: 用于多次独立迭代
- 处理错误: 当输入类型不确定时捕获 TypeError
- 使用异步生成器: 尽可能用于简单情况
资料来源
作者
列出所有 Python 教程。