Skip to main content

Python dependency injection framework

Project description

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!

Project details


Release history Release notifications | RSS feed

This version

2.0.0

Download files

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

Source Distribution

dependency_injector-2.0.0.tar.gz (17.3 kB view details)

Uploaded Source

File details

Details for the file dependency_injector-2.0.0.tar.gz.

File metadata

File hashes

Hashes for dependency_injector-2.0.0.tar.gz
Algorithm Hash digest
SHA256 639d3707b7908f5846742fde88dc51429be170606a64799b381adef72d51c1e0
MD5 3b54d639ebb71dd25bf750824d2f2979
BLAKE2b-256 9dda6e03be8cfbceb5e189040ad6d2a65d960b40e629a557f752313dc6a3e14f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page