← retour aux snippets

contextlib.asynccontextmanager: contexte asynchrone

Créer un context manager async pour encapsuler ouverture/fermeture.

objectif

Créer un context manager async pour encapsuler ouverture/fermeture.

code minimal

import asyncio
from contextlib import asynccontextmanager

events = []
@asynccontextmanager
async def resource():
    events.append("open")
    try:
        yield "res"
    finally:
        events.append("close")

async def main():
    async with resource() as r:
        await asyncio.sleep(0.001)
        print(r == "res")
    print(events == ["open","close"])  # attendu: True

asyncio.run(main())

utilisation

import asyncio
from contextlib import asynccontextmanager
@asynccontextmanager
async def r():
    yield 1
async def go():
    async with r() as x: return x
print(asyncio.run(go()) == 1)

variante(s) utile(s)

from contextlib import asynccontextmanager
print(callable(asynccontextmanager))

notes

  • Parfait pour gérer connexions réseau, transactions, sessions async.
  • Le bloc finally garantit la libération même en cas d’exception.