# Pattern 1: yield + use async forasyncdefget_sers():yield user1
asyncdefmy_function():asyncfor user in get_users():
process(ser)# wrong - can't await an AsyncGenerator
result =await get_sers()# TypeError
1.2 async def + return
asyncdefget_user():return single_ser
# correct consumptionasyncdefmy_function():
user =await get_ser()# Wrong - can't iterate a Corotineasyncfor u in get_user():# TypeError
2. async with
asyncdefget_session()-> AsyncGenerator[AsyncSession,None]:# 3 ✅# db_local_session = async_sessionmaker(...)asyncwith Database.db_local_session()as session:# 1 ✅try:yield session # 4a ✅ `yield` relates to `async def`, the caller needs to use `async for`await session.commit()# 2 ✅except Exception:await session.rollback()raise# ✅ Correct usage - async context manager@asynccontextmanagerasyncdefget_db_session()-> AsyncIterator[AsyncSession]:asyncfor session in Database.get_session():# 4b ✅yield session