Resources need reliable cleanup
Files, locks, database transactions and other resources often need cleanup whether an operation succeeds or fails. A context manager packages that setup and cleanup behavior behind the with statement.
The context manager protocol
Class-based context managers implement __enter__() and __exit__(). The contextlib module provides helpers for creating context managers without writing the full class protocol.
Why with is safer
Manual cleanup requires every path through the function to remember to release the resource. A context manager centralizes that guarantee and makes the lifetime of the resource visible in the code.
Practice: create a custom context manager that records the start and end of an operation even if an exception occurs inside the block.