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

Python/ContextManager (last edited 2023-01-07 04:01:52 by DominicRicottone)