= Python Context Manager = A '''context manager''' is an object that forms a scope inside a `with` block. This is useful for giving access to an externally-managed resource while gracefully handling errors. See also [[Python/ContextLib|contextlib]], a module for working with context managers. <> ---- == Example == {{{ import sqlite3 from pprint import pprint from types import TracebackType class Database(object): def __init__(self, cursor: sqlite3.Cursor) -> None: self._cursor = cursor def execute(self, cmd: str, vals: Tuple = tuple()) -> List: self._cursor.execute(cmd, vals) return self._cursor.fetchall() class database_connection(object): def __init__(self, filename: str) -> None: self._connect = sqlite3.connect(filename, detect_types=sqlite3.PARSE_DECLTYPES) self._cursor = self._connect.cursor() def __enter__(self) -> sqlite3.Cursor: return Database(self._cursor) def __exit__(self, typ: type[BaseException] | None, exc: BaseException | None, tb: TracebackType | None) -> bool: self._connect.commit() self._cursor.close() self._connect.close() with database_connection(":memory:") as db: db.execute("CREATE TABLE mytable (num INTEGER, name TEXT)") for n in range(10): db.execute("INSERT INTO mytable (num,name) VALUES (?,?)", (n,str(n))) data = db.execute("SELECT * FROM mytable") pprint(data) }}} ---- == Definition == A context manager needs to define an `__enter__` function and an `__exit__` function. The `__exit__` function is called if an error raises. To suppress errors, have it return `True`. ---- CategoryRicottone