Как работает async with?

Каким образом работает конструкция:

async with

В вопросе я опираюсь на первые строки примеров aiohttp.


Ответы (1 шт):

Автор решения: Dareten
from aiohttp import web

async def hello(request):
    return web.Response(text='Hello, world')

async def test_hello(aiohttp_client, loop):
    app = web.Application()
    app.router.add_get('/', hello)
    client = await aiohttp_client(app)
    resp = await client.get('/')
    assert resp.status == 200
    text = await resp.text()
    assert 'Hello, world' in text

Например, вот так.

По сути это тот же контекстный менеджер with, который имеет 2 дополнительных метода __aenter__ и __aexit__, что позволяет пользоваться контекстным менеджером для асинхронных приложений.

Использование обычного менеджера with не предусмотрено для асинхронных функций, так как у него не соответствующих методов. Разница в работе между with и async with в том, что второй не только выполняет все критические функции внутри, а также позволяет быть уверенным, что внутренний блок инструкций был awaited.

Документация по async with здесь.

→ Ссылка