异步迭代器适配器需实现同步__aiter__返回自身或新状态对象,及异步__anext__调用并处理底层anext()结果;状态须隔离,支持链式组合,避免复用同一底层迭代器。

要编写一个支持异步的迭代器适配器,核心是让适配器本身成为合法的异步迭代器——即它必须返回一个对象,该对象同时实现了 __aiter__(普通方法)和 __anext__(async 方法),且状态独立、可复用。
适配器需封装原始异步迭代器并增强行为
异步迭代器适配器不是直接修改原数据源,而是接收一个已有的异步可迭代对象(如 AsyncList、async def ... 生成器),在其上叠加逻辑(如过滤、映射、限流),再暴露新的异步迭代接口。
- 构造时接收原始异步可迭代对象(例如
aiter(source)得到的迭代器,或直接传入可调用的__aiter__对象) - 自身实现
__aiter__,通常返回self;关键状态(如当前索引、缓存项、是否完成)必须保存为实例属性 -
__anext__中主动调用底层迭代器的anext()或 await 其__anext__(),再对结果做处理(如转换、跳过、聚合) - 注意异常传递:当底层抛出
StopAsyncIteration,适配器也应原样抛出,不可吞掉
以“异步映射适配器”为例(AsyncMap)
这个适配器对每个异步产出的值应用一个协程函数(比如异步清洗、远程校验),再返回结果:
-
__aiter__(self)是普通方法,返回self -
__anext__(self)是 async 方法,先 await 底层anext(),再 await 用户提供的协程函数处理该值 - 状态仅维护一个底层迭代器实例(
self._inner),避免多次遍历时互相干扰
示例代码片段:
class AsyncMap:def __init__(self, aiterable, func):
self._inner = aiter(aiterable) # 预取迭代器
self._func = func
def __aiter__(self):
return self
async def __anext__(self):
item = await anext(self._inner)
return await self._func(item)
支持链式组合的关键设计
真正实用的适配器应能像标准库的 map/filter 一样串联使用。为此需确保:
- 每次调用
__aiter__都产生**新状态**:不能在类定义里共享self._index等,否则多个async for循环会冲突 - 推荐把状态管理下沉到独立的迭代器类中(如
_AsyncMapIterator),__aiter__每次返回一个新实例 - 适配器本身只负责配置(函数、参数等),不保存运行时数据
- 这样就能安全写出:
async for x in AsyncFilter(AsyncMap(data, clean), is_valid): ...
避开常见陷阱
很多初学者误以为“加个 async 就行”,实际容易踩坑:
- ❌ 在
__aiter__上加async:语法错误,__aiter__必须是同步方法 - ❌ 直接在
__aiter__里yield:这会产生异步生成器,但返回值不是符合协议的迭代器对象 - ❌ 复用同一个底层迭代器多次:
anext(it)调用一次就推进一次,多个协程并发调用会错乱 - ✅ 正确做法:每个
__aiter__返回新对象,新对象内创建专属的aiter(source)











