如何异步映射/过滤异步可迭代对象?

发布于 2021-01-29 14:58:52

假设我有一个异步可迭代对象,可以使用来传递它async for,然后又如何将其映射并过滤到新的异步迭代器上?以下代码是对我如何使用同步可迭代方法执行相同操作的适应,因此不起作用,因为syield内部不允许这样做async def

async def mapfilter(aiterable, p, func):
    async for payload in aiterable:
        if p(payload):

            # This part isn't allowed, but hopefully it should be clear
            # what I'm trying to accomplish.
            yield func(payload)
关注者
0
被浏览
100
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    一个最近公布的PEP草案(PEP 525)

    ,其支持定为Python
    3.6
    ,建议允许异步发电机与你想出了相同的语法。

    同时,如果您不想处理异步迭代器样板,还可以使用CryingCyclops在其注释中asyncio_extras提到的库。

    文档

    @async_generator
    async def mygenerator(websites):
        for website in websites:
            page = await http_fetch(website)
            await yield_async(page)
    
    async def fetch_pages():
        websites = ('http://foo.bar', 'http://example.org')
        async for sanitized_page in mygenerator(websites):
            print(sanitized_page)
    

    还有一个支持构造的async_generator库yield from



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看