Python - Context Managers (with)
Overview
Estimated time: 25–35 minutes
Context managers ensure resources are acquired and released safely. Learn the mental model behind with, custom context managers, and powerful tools in contextlib.
Learning Objectives
- Use withto manage files and other resources safely.
- Implement custom context managers with classes or @contextmanager.
- Leverage ExitStackfor dynamic, multiple contexts.
Prerequisites
- Exceptions and functions
Examples
# Always closes the file
with open("hello.txt", "w", encoding="utf-8") as f:
    f.write("Hello")
Guidance & Patterns
from contextlib import contextmanager
@contextmanager
def show_time(label):
    import time
    start = time.perf_counter()
    try:
        yield
    finally:
        dur = time.perf_counter() - start
        print(f"{label}: {dur:.3f}s")
with show_time("work"):
    sum(range(100000))
Best Practices
- Use ExitStackfor conditional resources and to flatten deeply nestedwithblocks.
- Ensure contexts handle exceptions correctly; consider idempotent cleanup.
Exercises
- Write a context manager that temporarily changes the working directory.
- Use ExitStackto manage an unknown set of file handles.