
Context managers handle setup and teardown automatically — even if an error occurs.
You already use them:
with open("file.txt") as f:
content = f.read()
# File is automatically closed hereHow it works: The with statement calls __enter__ on entry and __exit__ on exit (even on exceptions).
Custom context manager:
class Timer:
def __enter__(self):
import time
self.start = time.time()
return self
def __exit__(self, *args):
self.elapsed = time.time() - self.start
print(f"Elapsed: {self.elapsed:.2f}s")
with Timer() as t:
# do something
sum(range(1000000))
# Prints elapsed time automaticallyUsing contextlib:
from contextlib import contextmanager
@contextmanager
def managed_resource():
print("Setup")
yield
print("Teardown")Reference:
TaskLoco™ — The Sticky Note GOAT