You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何像使用同步迭代器一样使用异步迭代器并适配自定义列表类

问题原因

Python 内置list的构造函数仅支持接收同步可迭代对象,你传入的异步生成器属于异步可迭代对象,同步逻辑无法直接消费,因此直接调用MyList(x async for x in iterate())会报错。

最优实现方案

给自定义MyList添加异步构造类方法,直接迭代异步对象填充数据,全程没有中间列表生成,无额外内存开销:

import asyncio
from typing import AsyncIterable, Any


class MyList(list):
    @classmethod
    async def afrom_async_iter(cls, async_iter: AsyncIterable[Any]) -> "MyList":
        instance = cls()
        async for item in async_iter:
            instance.append(item)
        return instance


async def iterate():
    yield 1
    yield 2


async def main():
    # 仅需await调用异步构造方法即可,调用逻辑简洁
    return await MyList.afrom_async_iter(iterate())


result = asyncio.run(main())
print(result) # 输出 [1, 2]
print(type(result)) # 输出 <class '__main__.MyList'>

如果你不想修改MyList类的实现,也可以单独封装异步工具函数实现相同效果:

async def build_mylist(async_iter: AsyncIterable[Any]) -> MyList:
    res = MyList()
    async for item in async_iter:
        res.append(item)
    return res

# 调用方式
async def main():
    return await build_mylist(iterate())

方案优势

  • 内存效率和手动调用append完全一致,没有中间列表的拷贝开销
  • 逻辑封装复用,不需要每次构造都重复写异步循环代码

内容的提问来源于stack exchange,提问作者sasano8

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:48:05