Need help with python-dependency-injector?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

Global Rank
#36,903
Topics of expertise
singlet...
depende...
flask-r...
flask-a...
ioc-con...
python-...
aiohttp
cython
Location
RTP, North Carolina, United States
1.3K Stars 81 Forks BSD 3-Clause "New" or "Revised" License 1.8K Commits 20 Opened issues

Description

Dependency injection framework for Python

Services available

!
?

Need anything else?

Contributors list

.. figure:: https://raw.githubusercontent.com/wiki/ets-labs/python-dependency-injector/img/logo.svg :target: https://github.com/ets-labs/python-dependency-injector

|

.. image:: https://img.shields.io/pypi/v/dependency_injector.svg :target: https://pypi.org/project/dependency-injector/ :alt: Latest Version

.. image:: https://img.shields.io/pypi/l/dependency_injector.svg :target: https://pypi.org/project/dependency-injector/ :alt: License

.. image:: https://img.shields.io/pypi/pyversions/dependency_injector.svg :target: https://pypi.org/project/dependency-injector/ :alt: Supported Python versions

.. image:: https://img.shields.io/pypi/implementation/dependency_injector.svg :target: https://pypi.org/project/dependency-injector/ :alt: Supported Python implementations

.. image:: https://pepy.tech/badge/dependency-injector :target: https://pepy.tech/project/dependency-injector :alt: Downloads

.. image:: https://pepy.tech/badge/dependency-injector/month :target: https://pepy.tech/project/dependency-injector :alt: Downloads

.. image:: https://pepy.tech/badge/dependency-injector/week :target: https://pepy.tech/project/dependency-injector :alt: Downloads

.. image:: https://img.shields.io/pypi/wheel/dependency-injector.svg :target: https://pypi.org/project/dependency-injector/ :alt: Wheel

.. image:: https://img.shields.io/github/workflow/status/ets-labs/python-dependency-injector/Tests%20and%20linters/master :target: https://github.com/ets-labs/python-dependency-injector/actions :alt: Build Status

.. image:: https://coveralls.io/repos/github/ets-labs/python-dependency-injector/badge.svg?branch=master :target: https://coveralls.io/github/ets-labs/python-dependency-injector?branch=master :alt: Coverage Status

What is
Dependency Injector
?

Dependency Injector
is a dependency injection framework for Python.

It helps implementing the dependency injection principle.

Key features of the

Dependency Injector
:
  • Providers. Provides
    Factory
    ,
    Singleton
    ,
    Callable
    ,
    Coroutine
    ,
    Object
    ,
    List
    ,
    Dict
    ,
    Configuration
    ,
    Resource
    ,
    Dependency
    and
    Selector
    providers that help assembling your objects. See
    Providers 
    _.
  • Overriding. Can override any provider by another provider on the fly. This helps in testing and configuring dev / stage environment to replace API clients with stubs etc. See
    Provider overriding 
    _.
  • Configuration. Reads configuration from
    yaml
    &
    ini
    files,
    pydantic
    settings, environment variables, and dictionaries. See
    Configuration provider 
    _.
  • Containers. Provides declarative and dynamic containers. See
    Containers 
    _.
  • Resources. Helps with initialization and configuring of logging, event loop, thread or process pool, etc. Can be used for per-function execution scope in tandem with wiring. See
    Resource provider 
    _.
  • Wiring. Injects dependencies into functions and methods. Helps integrating with other frameworks: Django, Flask, Aiohttp, Sanic, FastAPI, etc. See
    Wiring 
    _.
  • Asynchronous. Supports asynchronous injections. See
    Asynchronous injections 
    _.
  • Typing. Provides typing stubs,
    mypy
    -friendly. See
    Typing and mypy 
    _.
  • Performance. Fast. Written in
    Cython
    .
  • Maturity. Mature and production-ready. Well-tested, documented and supported.

.. code-block:: python

from dependencyinjector import containers, providers from dependencyinjector.wiring import inject, Provide

class Container(containers.DeclarativeContainer):

   config = providers.Configuration()

api_client = providers.Singleton( ApiClient, api_key=config.api_key, timeout=config.timeout.as_int(), )

service = providers.Factory( Service, api_client=api_client, )

@inject def main(service: Service = Provide[Container.service]): ...

if name == 'main': container = Container() container.config.apikey.fromenv('APIKEY') container.config.timeout.fromenv('TIMEOUT') container.wire(modules=[sys.modules[name]])

   main()  # 

When you call

main()
function the
Service
dependency is assembled and injected automatically.

When doing a testing you call the

container.api_client.override()
to replace the real API client with a mock. When you call
main()
the mock is injected.

You can override any provider with another provider.

It also helps you in configuring project for the different environments: replace an API client with a stub on the dev or stage.

With the

Dependency Injector
objects assembling is consolidated in the container. Dependency injections are defined explicitly. This makes easier to understand and change how application works.

.. figure:: https://raw.githubusercontent.com/wiki/ets-labs/python-dependency-injector/img/di-readme.svg :target: https://github.com/ets-labs/python-dependency-injector

Visit the docs to know more about the

Dependency injection and inversion of control in Python 
_.

Installation

The package is available on the

PyPi
_::
pip install dependency-injector

Documentation

The documentation is available

here 
_.

Examples

Choose one of the following:

  • Application example (single container) 
    _
  • Application example (multiple containers) 
    _
  • Decoupled packages example (multiple containers) 
    _
  • Boto3 example 
    _
  • Django example 
    _
  • Flask example 
    _
  • Aiohttp example 
    _
  • Sanic example 
    _
  • FastAPI example 
    _
  • FastAPI + Redis example 
    _
  • FastAPI + SQLAlchemy example 
    _

Tutorials

Choose one of the following:

  • Flask web application tutorial 
    _
  • Aiohttp REST API tutorial 
    _
  • Asyncio monitoring daemon tutorial 
    _
  • CLI application tutorial 
    _

Concept

The framework stands on the

PEP20 (The Zen of Python) 
_ principle:

.. code-block:: bash

Explicit is better than implicit

You need to specify how to assemble and where to inject the dependencies explicitly.

The power of the framework is in a simplicity.

Dependency Injector
is a simple tool for the powerful concept.

Frequently asked questions

What is the dependency injection? - dependency injection is a principle that decreases coupling and increases cohesion

Why should I do the dependency injection? - your code becomes more flexible, testable and clear 😎

How do I start doing the dependency injection? - you start writing the code following the dependency injection principle - you register all of your application components and their dependencies in the container - when you need a component, you specify where to inject it or get it from the container

What price do I pay and what do I get? - you need to explicitly specify the dependencies - it will be extra work in the beginning - it will payoff as the project grows

Have a question? - Open a

Github Issue 
_

Found a bug? - Open a

Github Issue 
_

Want to help? - |star| Star the

Dependency Injector
on the
Github 
_ - |new| Start a new project with the
Dependency Injector
- |tell| Tell your friend about the
Dependency Injector

Want to contribute? - |fork| Fork the project - |pull| Open a pull request to the

develop
branch

.. _PyPi: https://pypi.org/project/dependency-injector/

.. |star| unicode:: U+2B50 U+FE0F .. star sign1 .. |new| unicode:: U+1F195 .. new sign .. |tell| unicode:: U+1F4AC .. tell sign .. |fork| unicode:: U+1F500 .. fork sign .. |pull| unicode:: U+2B05 U+FE0F .. pull sign

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.