picobox icon indicating copy to clipboard operation
picobox copied to clipboard

Dependency injection framework designed with Python in mind.

Picobox

.. image:: https://img.shields.io/pypi/v/picobox.svg :target: https://pypi.python.org/pypi/picobox

.. image:: https://img.shields.io/github/workflow/status/ikalnytskyi/picobox/ci/master :target: https://github.com/ikalnytskyi/picobox

.. image:: https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg :target: https://saythanks.io/to/ikalnytskyi

Picobox is opinionated dependency injection framework designed to be clean, pragmatic and with Python in mind. No complex graphs, no implicit injections, no type bindings – just picoboxes, and explicit demands!

Why?

Because we usually want to decouple our code and Python lack of clean and pragmatic solutions (even third parties).

Features

  • Support both values and factories.
  • Support scopes (e.g. singleton, threadlocal, contextvars).
  • Push boxes on stack, and use the top one to access values.
  • Thread-safe.
  • Lightweight (~500 LOC including scopes).
  • Zero dependencies.
  • Pure Python.
  • Annotated with types.

Quickstart

First

.. code:: bash

$ [sudo] python -m pip install picobox

and then

.. code:: python

import picobox
import requests


@picobox.pass_("conf")
@picobox.pass_("requests", as_="session")
def get_resource(uri, session, conf):
    return session.get(conf["base_uri"] + uri)


box = picobox.Box()
box.put("conf", {"base_uri": "http://example.com"})
box.put("requests", factory=requests.Session, scope=picobox.threadlocal)

with picobox.push(box):
    get_resource("/resource", requests.Session(), {})
    get_resource("/resource", requests.Session())
    get_resource("/resource")

Links

  • Documentation: https://picobox.readthedocs.io
  • Source: https://github.com/ikalnytskyi/picobox
  • Bugs: https://github.com/ikalnytskyi/picobox/issues