Introduction
Context managers ensure resources are properly acquired and released, even when errors occur.
Using with Statement
# File handling
with open("file.txt", "r") as f:
content = f.read()
# File automatically closed
# Lock management
from threading import Lock
lock = Lock()
with lock:
# Critical section
shared_resource += 1
# Lock automatically released
Creating Context Managers
# Using class
class Timer:
def __enter__(self):
self.start = time.time()
return self
def __exit__(self, *args):
self.end = time.time()
self.elapsed = self.end - self.start
with Timer() as t:
time.sleep(1)
print(f"Elapsed: {t.elapsed}")
# Using generator
from contextlib import contextmanager
@contextmanager
def timer():
start = time.time()
try:
yield
finally:
print(f"Time: {time.time() - start}")
Practice Problems
- Create database connection context manager
- Implement temporarily change directory context manager
- Build transaction context manager with rollback
- Create timer decorator as context manager
- Manage multiple resources simultaneously