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")