Python Context Managers

by Wynonna Judd March 12, 2026 Public
73 views Raw Download Revisions (v1)
context_managers.py python Raw
import time
import contextlib
from typing import Generator


@contextlib.contextmanager
def timer(label: str = "Elapsed") -> Generator[None, None, None]:
    """Print elapsed time after the block."""
    start = time.perf_counter()
    try:
        yield
    finally:
        elapsed = time.perf_counter() - start
        print(f"{label}: {elapsed:.4f}s")


@contextlib.contextmanager
def suppress_exceptions(*exceptions):
    """Silence specific exceptions."""
    try:
        yield
    except exceptions:
        pass


class TempEnv:
    """Temporarily set environment variables."""
    def __init__(self, **kwargs):
        self.kwargs = kwargs
        self._orig = {}

    def __enter__(self):
        import os
        for k, v in self.kwargs.items():
            self._orig[k] = os.environ.get(k)
            os.environ[k] = v
        return self

    def __exit__(self, *_):
        import os
        for k, v in self._orig.items():
            if v is None: os.environ.pop(k, None)
            else: os.environ[k] = v


# Usage
with timer("DB query"):
    time.sleep(0.1)  # simulate work

with suppress_exceptions(KeyError, ValueError):
    raise ValueError("ignored")

with TempEnv(DEBUG="true", LOG_LEVEL="debug"):
    print("Running in debug mode")
Skip to toolbar