Как я могу ждать внутри __await__ будущего?

PEP 0492 добавляет новый метод __await__ magic. Объект, реализующий этот метод, становится объектом, подобным будущему, и его можно await используя await . Ясно:

 import asyncio class Waiting: def __await__(self): yield from asyncio.sleep(2) print('ok') async def main(): await Waiting() if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(main()) 

Хорошо, но что, если я хочу вызвать некоторую async def определенную функцию вместо asyncio.sleep ? Я не могу использовать __await__ потому что __await__ не является функцией async , я не могу использовать yield from потому что native coroutines требует выражения await :

 async def new_sleep(): await asyncio.sleep(2) class Waiting: def __await__(self): yield from new_sleep() # this is TypeError await new_sleep() # this is SyntaxError print('ok') 

Как я могу это решить?

  • как я могу асинхронно отображать / фильтровать асинхронный итерабельный?
  • Блоки Python 3.5 aiohttp даже при использовании async / wait
  • 2 Solutions collect form web for “Как я могу ждать внутри __await__ будущего?”

    Используйте прямой __await__() :

     async def new_sleep(): await asyncio.sleep(2) class Waiting: def __await__(self): return new_sleep().__await__() 

    Решение было рекомендовано Юрием Селивановым (автором PEP 492 ) для библиотеки aioodbc

    Я не понял, почему я не могу уступить из native coroutine внутри __await__ , но похоже, что можно получить от генератора coroutine внутри __await__ и получить __await__ сопрограмму внутри этого генератора coroutine . Оно работает:

     async def new_sleep(): await asyncio.sleep(2) class Waiting: def __await__(self): @asyncio.coroutine def wrapper(coro): return (yield from coro) return (yield from wrapper(new_sleep())) 
    Interesting Posts

    Scapy: как получить полный заголовок IP-пакета?

    Как передать переменную javascript в макросы в шаблоне jinja2

    Фильтровать список строк, игнорируя подстроки других элементов

    Как создать список случайных целых векторов, сумма которых равна x

    Несколько приложений mod_wsgi на одном виртуальном хосте, направляющем неправильное приложение

    Как использовать хранилище данных с высокой репликацией

    Что значит pythonic?

    Невозможно понять формат данных 802.11 Data Frame в файле PcapNG

    есть ли Java-эквивалент Python defaultdict?

    pyserial – можно записать в последовательный порт из потока a, сделать блокировку чтения из потока b?

    Как я могу скрыть косые черты в python, так что open () видит мой файл как имя файла для записи, а не путь к файлу для чтения?

    Удалить импортированный модуль python

    Изменение цвета штриха в 3D-графике в matplotlib на основе значения

    Как выбрать все местоположения уникальных элементов в массиве numpy 2d с ограничивающей рамкой вокруг них?

    Сохранять неизменные данные при сохранении массива Numpy для изображения с помощью Scipy imsave

    Python - лучший язык программирования в мире.