Агрегирование асинхронного генератора в кортеж

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

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?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
7
0
1 649
1

Ответы 1

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

Другие вопросы по теме