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