Context Managers
Implement __enter__ and __exit__ for custom resource management, or use contextlib.contextmanager with a generator.
Implement __enter__ and __exit__ for custom resource management, or use contextlib.contextmanager with a generator.
from contextlib import contextmanager
@contextmanager
def timer(label: str = ""):
import time
start = time.perf_counter()
try:
yield
finally:
elapsed = time.perf_counter() - start
print(f"{label}: {elapsed:.3f}s")
with timer("db query"):
results = db.fetch_all()
@contextmanager
def temp_directory():
import tempfile, shutil
path = tempfile.mkdtemp()
try: yield path
finally: shutil.rmtree(path)
The yield expression in a contextmanager generator replaces __enter__; the finally block is __exit__.