Как использовать ожидание внутри функции карты - PullRequest
1 голос
/ 11 июля 2020

У меня есть следующий код

async def foo():
   some_tuple = tuple(map(bar, some_tuple))
async def bar(data):
   # Await another function and do some other stuff
   return something

Поскольку bar является асинхронным c, его нужно ждать. Однако я не уверен, где ждать bar. Я пробовал ждать внутри map, пробовал ждать map, пробовал ждать tuple, но ничего не работало.

Как мне ждать bar внутри map?

1 Ответ

3 голосов
/ 11 июля 2020

Вы не можете использовать map с функциями asyn c, так как map является синхронным и не приостанавливает выполнение внутри l oop. То же самое относится к конструктору tuple, который ожидает синхронный генератор.

Чтобы исправить это, вы можете заменить пару map / tuple на понимание списка, которое может быть asyn c, и легко конвертируется в кортеж:

some_tuple = tuple([await fn(elem) for elem in iterable])

Другой вариант - использовать asyn c версии map и tuple из пакета asyncstdlib , который также предоставляет много дополнительного и полезного функционала:

import asyncstdlib.builtins.map as amap
import asyncstdlib.builtins.tuple as atuple

some_tuple = await atuple(amap(fn, iterable))
...