with — Expert Playground
Wraps a block with a context manager for automatic setup/teardown
Python Playground
import asyncio
class AsyncConnection:
def __init__(self, name):
self.name = name
async def __aenter__(self):
print(f"Async connecting to {self.name}")
await asyncio.sleep(0)
return self
async def __aexit__(self, *args):
print(f"Async disconnecting from {self.name}")
await asyncio.sleep(0)
async def main():
async with AsyncConnection("database") as conn:
print(f"Using {conn.name}")
asyncio.run(main)
# Bytecode comparison
import dis
def sync_ctx():
with open("x"): pass
print("\nWith statement bytecode:")
dis.dis(sync_ctx)
Output
Click "Run" to execute your code
async with uses __aenter__ and __aexit__ for async setup/teardown. The bytecode uses BEFORE_ASYNC_WITH instead of BEFORE_WITH.
Challenge
Try modifying the code above to explore different behaviors. Can you extend the example to handle a new use case?