Skip to main content

Dependency Injector is a Python dependency injection framework. It was designed to be unified, developer-friendly tool for managing any kind of Python objects and their dependencies in formal, pretty way.

Dependency Injector framework key features are:

  • Easy, smart, pythonic style.

  • Obvious, clear structure.

  • Extensibility and flexibility.

  • Memory efficiency.

  • Thread safety.

  • Documentation.

  • Semantic versioning.

Status

PyPi

Latest Version License

Python versions and implementations

Supported Python versions Supported Python implementations

Builds and tests coverage

Build Status Coverage Status

Installation

Dependency Injector library is available on PyPi:

pip install dependency_injector

Example

Brief example below demonstrates usage of Dependency Injector containers and providers for definition of several IoC containers for some microservice system that consists from several business and platform services:

"""Example of several Dependency Injector IoC containers."""

import sqlite3
import boto.s3.connection
import example.services

import dependency_injector.containers as containers
import dependency_injector.providers as providers


class Platform(containers.DeclarativeContainer):
    """IoC container of platform service providers."""

    database = providers.Singleton(sqlite3.connect, ':memory:')

    s3 = providers.Singleton(boto.s3.connection.S3Connection,
                             aws_access_key_id='KEY',
                             aws_secret_access_key='SECRET')


class Services(containers.DeclarativeContainer):
    """IoC container of business service providers."""

    users = providers.Factory(example.services.Users,
                              db=Platform.database)

    auth = providers.Factory(example.services.Auth,
                             db=Platform.database,
                             token_ttl=3600)

    photos = providers.Factory(example.services.Photos,
                               db=Platform.database,
                               s3=Platform.s3)

Next example demonstrates usage of @inject decorator with IoC containers defined above:

"""Dependency Injector @inject decorator example."""

import application
import dependency_injector.injections as injections


@injections.inject(users_service=application.Services.users)
@injections.inject(auth_service=application.Services.auth)
@injections.inject(photos_service=application.Services.photos)
def main(users_service, auth_service, photos_service):
    """Main function."""
    user = users_service.get_user('user')
    auth_service.authenticate(user, 'secret')
    photos_service.upload_photo(user['id'], 'photo.jpg')


if __name__ == '__main__':
    main()

Alternative definition styles

Dependecy Injector supports few other styles of dependency injections definition.

IoC containers from previous example could look like these:

class Platform(containers.DeclarativeContainer):
    """IoC container of platform service providers."""

    database = providers.Singleton(sqlite3.connect) \
        .add_args(':memory:')

    s3 = providers.Singleton(boto.s3.connection.S3Connection) \
        .add_kwargs(aws_access_key_id='KEY',
                    aws_secret_access_key='SECRET')


class Services(containers.DeclarativeContainer):
    """IoC container of business service providers."""

    users = providers.Factory(example.services.Users) \
        .add_kwargs(db=Platform.database)

    auth = providers.Factory(example.services.Auth) \
        .add_kwargs(db=Platform.database,
                    token_ttl=3600)

    photos = providers.Factory(example.services.Photos) \
        .add_kwargs(db=Platform.database,
                    s3=Platform.s3)

or like this these:

class Platform(containers.DeclarativeContainer):
    """IoC container of platform service providers."""

    database = providers.Singleton(sqlite3.connect)
    database.add_args(':memory:')

    s3 = providers.Singleton(boto.s3.connection.S3Connection)
    s3.add_kwargs(aws_access_key_id='KEY',
                  aws_secret_access_key='SECRET')


class Services(containers.DeclarativeContainer):
    """IoC container of business service providers."""

    users = providers.Factory(example.services.Users)
    users.add_kwargs(db=Platform.database)

    auth = providers.Factory(example.services.Auth)
    auth.add_kwargs(db=Platform.database,
                    token_ttl=3600)

    photos = providers.Factory(example.services.Photos)
    photos.add_kwargs(db=Platform.database,
                      s3=Platform.s3)

You can get more Dependency Injector examples in /examples directory on GitHub:

https://github.com/ets-labs/python-dependency-injector

Documentation

Dependency Injector documentation is hosted on ReadTheDocs:

Feedback

Feel free to post questions, bugs, feature requests, proposals etc. on Dependency Injector GitHub Issues:

https://github.com/ets-labs/python-dependency-injector/issues

Your feedback is quite important!

Metadata

Release files for dependency-injector 2.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dependency-injector 2.0.0
File Size Uploaded Provenance
dependency_injector-2.0.0.tar.gz 17.3 kB Without provenance Details

Release files / dependency_injector-2.0.0.tar.gz

Download URL dependency_injector-2.0.0.tar.gz
Size 17.3 kB
Tags Source
SHA-256 checksum
How to use checksums
639d3707b7908f5846742fde88dc51429be170606a64799b381adef72d51c1e0
BLAKE2b-256 checksum
How to use checksums
9dda6e03be8cfbceb5e189040ad6d2a65d960b40e629a557f752313dc6a3e14f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Security for dependency-injector 2.0.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

2.0.0 This release

1 release file No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page