При попытке агрегировать результаты асинхронного генератора, например:
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' object is not iterable
при выполнении строки async for.
Но PEP 530, кажется, предполагает, что это должно быть действительным:
Asynchronous Comprehensions
We propose to allow using async for inside list, set and dict comprehensions. Pending PEP 525 approval, we can also allow creation of asynchronous generator expressions.
Examples:
- set comprehension: {i async for i in agen()};
- list comprehension: [i async for i in agen()];
- dict comprehension: {i: i ** 2 async for i in agen()};
- generator expression: (i ** 2 async for i in agen()).
Что происходит и как я могу объединить асинхронный генератор в один tuple?






В отрывке 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()])