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.