tg-me.com/BookPython/3484
Last Update:
Обе конструкции for
и with
могут быть асинхронными. async with
использует магические методы __aenter__
и __aexit__
, а async for
— методы __aiter__
и __anext__
. Все они асинхронные, и внутри них можно использовать await
:
import asyncio
class Sleep:
def __init__(self, t):
self._t = t
async def __aenter__(self):
await asyncio.sleep(self._t / 2)
async def __aexit__(self, *args):
await asyncio.sleep(self._t / 2)
async def main():
async with Sleep(2):
print('*')
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Когда вы реализуете метод
__iter__
, часто вместо написания итератора с методом __next__
используется оператор yield
, который делает метод __iter__
генератором:
class Bracketed:
def __init__(self, data):
self._data = data
def __iter__(self):
for x in self._data:
yield '({})'.format(x)
print(list(Bracketed([1, 2, 3])))
# ['(1)', '(2)', '(3)']
PEP 525 позволяет делать то же самое с методом
__aiter__
. Наличие операторов yield
и await
в теле функции делает её асинхронным генератором. В то время как await
используется для взаимодействия с циклом событий, yield
управляет работой с for
:
import asyncio
class Slow:
def __init__(self, data, t=1):
self._data = data
self._t = t
async def __aiter__(self):
for x in self._data:
await asyncio.sleep(self._t)
yield x
async def main():
async for x in Slow([1, 2, 3]):
print(x)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
👉@BookPython
BY Библиотека Python разработчика | Книги по питону
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/BookPython/3484