Skip to main content
This is a pre-production deployment of Warehouse. Changes made here affect the production instance of PyPI (
Help us improve Python packaging - Donate today!

Dependency Injection Container for Python 3+. Uses Python 3 annotations to provide hints for the components that should be injected.

Project Description


Dependency Injection Container for Python 3+ influenced partially by Autofac. dic aims to be a tiny “out of the way” framework to help realise IoC via dependency injection. dic uses Python 3 annotations to provide hints for the components that should be injected.


dic documentation is available via Read the Docs.


dic is available via pip:
pip install dic


Currently, dic supports:

  1. Constructor injection for classes
  2. Factory and Lazy relationships
  3. Registration via:
    1. Constructor matching for a registered class
    2. Custom callback
    3. Pre-created instances
  4. Lifetime scopes:
    1. Instance per dependency
    2. Single instance

Quick Example

A quick example on how to use dic:
import dic

class SimpleThing(object):
    def say(self, message):

class RequiresThing(object):
    def __init__(self, thing: SimpleThing):
        self.thing = thing

    def say(self, message):

# build the container
builder = dic.container.ContainerBuilder()

builder.register_class(RequiresThing, component_scope=dic.scope.SingleInstance)

container =

# use the container

# Note there'll only be one of these due to SingleInstance scoping during build
x = container.resolve(RequiresThing)
x.say("my message")


dic supports basic relationships:

  1. dic.rel.Lazy - don’t create the dependency until it’s first used
  2. dic.rel.Factory - the component wants to create other components. Lifetime scopes are respected. Supports custom arguments.
Using a factory:
import dic

class SimpleThing(object):
    def __init__(self, special_argument):
        self.special_argument = special_argument

class BuildsThings(object):
    def __init__(self, thing_factory: dic.rel.Factory(SimpleThing)):
        self.thing_factory = thing_factory

    def build_me_a_thing(self):
        # builds a new thing using the injected factory
        # Note that custom arguments can be provided here
        self.thing_factory(special_argument="My super special argument")

# build the container
builder = dic.container.ContainerBuilder()


container =

# use the container

x = container.resolve(BuildsThing)

# use it
thing = x.build_me_a_thing()
# ...


  1. Is dic thread-safe?
Yes. dic.rel.Lazy and dic.container.Container.resolve() are thread-safe. As a result, do not store the component_context given to register_callback callbacks, as thread-safety is enforced at the container.resolve() level.
  1. Can I define my own scopes?
Yes. Derive a scope from dic.scope.Scope. Scopes can be used to provide lifetime for a calling thread, for example
Release History

Release History

This version
History Node


History Node


History Node


History Node


History Node


History Node


Download Files

Download Files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

File Name & Checksum SHA256 Checksum Help Version File Type Upload Date
dic-1.5.2b1.tar.gz (7.3 kB) Copy SHA256 Checksum SHA256 Source Jan 4, 2015

Supported By

WebFaction WebFaction Technical Writing Elastic Elastic Search Pingdom Pingdom Monitoring Dyn Dyn DNS Sentry Sentry Error Logging CloudAMQP CloudAMQP RabbitMQ Heroku Heroku PaaS Kabu Creative Kabu Creative UX & Design Fastly Fastly CDN DigiCert DigiCert EV Certificate Rackspace Rackspace Cloud Servers DreamHost DreamHost Log Hosting