Карта, фильтр и itertools для составления асинхронных итераторов - PullRequest
0 голосов
/ 31 мая 2018

Поддерживает ли Python операции в функциональном стиле на асинхронных итераторах?Я знаю, что могу использовать map, filter и itertools для ленивого преобразования и потребления данных, поступающих из обычных генераторов:

from itertools import accumulate, takewhile

def generator():
    a, b = 1, 1
    while True:
        yield a
        a, b = b, a + b

# create another iterator, no computation is started yet:
another_iterator = takewhile(lambda x: x < 100, accumulate(generator()))
# start consuming data:
print(list(another_iterator))
# [1, 2, 4, 7, 12, 20, 33, 54, 88]

Теперь, то же самое не поддерживается в Python 3.6асинхронные генераторы / итераторы, потому что, конечно, они не реализуют обычный протокол итератора:

async def agenerator():
    a, b = 1, 1
    while True:
        yield a
        a, b = b, a + b

accumulate(agenerator())

TypeError: объект 'async_generator' не повторяется

Есть ли какой-то видasync map или async itertools для достижения такого же ленивого поведения в Python 3.6 / 3.7?

1 Ответ

0 голосов
/ 31 мая 2018

Самая полная асинхронная версия itertools, которую я видел, это aiostream module.Ваш пример будет:

import asyncio
from aiostream.stream import takewhile, accumulate, list as alist


async def agenerator():
    a, b = 1, 1
    while True:
        yield a
        a, b = b, a + b


async def main():
    another_iterator = takewhile(
        accumulate(agenerator()),
        lambda x: x < 100, 
    )

    res = await alist(another_iterator)

    print(res)


loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
...