Объединение асинхронного генератора в кортеж - PullRequest
0 голосов
/ 12 сентября 2018

При попытке агрегировать результаты от асинхронного генератора, вот так:

async def result_tuple():
    async def result_generator():
        # some await things happening in here
        yield 1
        yield 2
    return tuple(num async for num in result_generator())

Я получаю

TypeError: объект 'async_generator' не может быть повторен

при выполнении строки async for.

Но PEP 530 , кажется, предполагает, что оно должно быть действительным:

Асинхронное понимание

Мы предлагаем разрешить использование асинхронного для внутреннего списка, заданий и диктовок. В ожидании утверждения PEP 525 мы также можем разрешить создание выражений асинхронного генератора.

Примеры:

  • установить понимание: {i async for i in agen ()};
  • Понимание списка: [i async for i in agen ()];
  • понимание слова: {i: i ** 2 async для i в agen ()};
  • выражение генератора: (i ** 2 асинхронно для i в agen ()).

Что происходит и как я могу объединить асинхронный генератор в один tuple?

1 Ответ

0 голосов
/ 12 сентября 2018

В выдержке из PEP все перечисления перечислены рядом в одном и том же списке, но выражение генератора сильно отличается от других.

Не существует такой вещи, как "tuple понимание ".Аргумент tuple() создает асинхронный генератор:

tuple(num async for num in result_generator())

Строка эквивалентна tuple(result_generator()).Затем кортеж пытается выполнить итерацию по генератору синхронно и поднимает TypeError.

. Однако остальные понимания будут работать, как и ожидалось.Таким образом, можно сгенерировать кортеж, сначала собрав его в список, например:

async def result_tuple():
    async def result_generator():
        # some await things happening in here
        yield 1
        yield 2
    return tuple([num async for num in result_generator()])
...