TG Telegram Group & Channel
Библиотека Python разработчика | Книги по питону | United States America (US)
Create: 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

Обе конструкции 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
👍4


>>Click here to continue<<

Библиотека Python разработчика | Книги по питону




Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)