.. 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/actions/workflow/status/ets-labs/python-dependency-injector/tests-and-linters.yml?branch=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 implement 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 assemble your objects.
See `Providers <https://python-dependency-injector.ets-labs.org/providers/index.html>`_.
- **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 <https://python-dependency-injector.ets-labs.org/providers/overriding.html>`_.
- **Configuration**. Reads configuration from ``yaml``, ``ini``, and ``json`` files, ``pydantic`` settings,
environment variables, and dictionaries.
See `Configuration provider <https://python-dependency-injector.ets-labs.org/providers/configuration.html>`_.
- **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 <https://python-dependency-injector.ets-labs.org/providers/resource.html>`_.
- **Containers**. Provides declarative and dynamic containers.
See `Containers <https://python-dependency-injector.ets-labs.org/containers/index.html>`_.
- **Wiring**. Injects dependencies into functions and methods. Helps integrate with
other frameworks: Django, Flask, Aiohttp, Sanic, FastAPI, etc.
See `Wiring <https://python-dependency-injector.ets-labs.org/wiring.html>`_.
- **Asynchronous**. Supports asynchronous injections.
See `Asynchronous injections <https://python-dependency-injector.ets-labs.org/providers/async.html>`_.
- **Typing**. Provides typing stubs, ``mypy``-friendly.
See `Typing and mypy <https://python-dependency-injector.ets-labs.org/providers/typing_mypy.html>`_.
- **Performance**. Fast. Written in ``Cython``.
- **Maturity**. Mature and production-ready. Well-tested, documented, and supported.
.. code-block:: python
from dependency_injector import containers, providers
from dependency_injector.wiring import Provide, inject
class Container(containers.DeclarativeContainer):
config = providers.Configuration()
api_client = providers.Singleton(
ApiClient,
api_key=config.api_key,
timeout=config.timeout,
)
service = providers.Factory(
Service,
api_client=api_client,
)
@inject
def main(service: Service = Provide[Container.service]) -> None:
...
if __name__ == "__main__":
container = Container()
container.config.api_key.from_env("API_KEY", required=True)
container.config.timeout.from_env("TIMEOUT", as_=int, default=5)
container.wire(modules=[__name__])
main() # <-- dependency is injected automatically
with container.api_client.override(mock.Mock()):
main() # <-- overridden dependency is injected automatically
When you call the ``main()`` function the ``Service`` dependency is assembled and injected automatically.
When you do testing, you call the ``container.api_client.override()`` method 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 a re-configuring project for different environments: replace an API client
with a stub on the dev or stage.
With the ``Dependency Injector``, object assembling is consolidated in a container. Dependency injections are defined explicitly.
This makes it easier to understand and change how an 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 <https://python-dependency-injector.ets-labs.org/introduction/di_in_python.html>`_.
Installation
------------
The package is available on the `PyPi`_::
pip install dependency-injector
Documentation
-------------
The documentation is available `here <https://python-dependency-injector.ets-labs.org/>`_.
Examples
--------
Choose one of the following:
- `Application example (single container) <https://python-dependency-injector.ets-labs.org/examples/application-single-container.html>`_
- `Application example (multiple containers) <https://python-dependency-injector.ets-labs.org/examples/application-multiple-containers.html>`_
- `Decoupled packages example (multiple containers) <https://python-dependency-injector.ets-labs.org/examples/decoupled-packages.html>`_
- `Boto3 example <https://python-dependency-injector.ets-labs.org/examples/boto3.html>`_
- `Django example <https://python-dependency-injector.ets-labs.org/examples/django.html>`_
- `Flask example <https://python-dependency-injector.ets-labs.org/examples/flask.html>`_
- `Aiohttp example <https://python-dependency-injector.ets-labs.org/examples/aiohttp.html>`_
- `Sanic example <https://python-dependency-injector.ets-labs.org/examples/sanic.html>`_
- `FastAPI example <https://python-dependency-injector.ets-labs.org/examples/fastapi.html>`_
- `FastAPI + Redis example <https://python-dependency-injector.ets-labs.org/examples/fastapi-redis.html>`_
- `FastAPI + SQLAlchemy example <https://python-dependency-injector.ets-labs.org/examples/fastapi-sqlalchemy.html>`_
Tutorials
---------
Choose one of the following:
- `Flask web application tutorial <https://python-dependency-injector.ets-labs.org/tutorials/flask.html>`_
- `Aiohttp REST API tutorial <https://python-dependency-injector.ets-labs.org/tutorials/aiohttp.html>`_
- `Asyncio monitoring daemon tutorial <https://python-dependency-injector.ets-labs.org/tutorials/asyncio-daemon.html>`_
- `CLI application tutorial <https://python-dependency-injector.ets-labs.org/tutorials/cli.html>`_
Concept
-------
The framework stands on the `PEP20 (The Zen of Python) <https://www.python.org/dev/peps/pep-0020/>`_ 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 its simplicity.
``Dependency Injector`` is a simple tool for the powerful concept.
Frequently asked questions
--------------------------
What is 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 applying 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 project grows
Have a question?
- Open a `Github Issue <https://github.com/ets-labs/python-dependency-injector/issues>`_
Found a bug?
- Open a `Github Issue <https://github.com/ets-labs/python-dependency-injector/issues>`_
Want to help?
- |star| Star the ``Dependency Injector`` on the `Github <https://github.com/ets-labs/python-dependency-injector/>`_
- |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
Raw data
{
"_id": null,
"home_page": null,
"name": "pozalabs-dependency-injector",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.11",
"maintainer_email": null,
"keywords": "Dependency injection, DI, Inversion of Control, IoC, Factory, Singleton, Design patterns, Flask",
"author": "pozalabs",
"author_email": "contact@pozalabs.com",
"download_url": "https://files.pythonhosted.org/packages/d3/48/666fcf1d8c8505e0cb259a1187a76eafdd0d11e1aed28a4c595b3463474e/pozalabs_dependency_injector-4.43.0.tar.gz",
"platform": null,
"description": ".. figure:: https://raw.githubusercontent.com/wiki/ets-labs/python-dependency-injector/img/logo.svg\n :target: https://github.com/ets-labs/python-dependency-injector\n\n| \n\n.. image:: https://img.shields.io/pypi/v/dependency_injector.svg\n :target: https://pypi.org/project/dependency-injector/\n :alt: Latest Version\n \n.. image:: https://img.shields.io/pypi/l/dependency_injector.svg\n :target: https://pypi.org/project/dependency-injector/\n :alt: License\n\n.. image:: https://img.shields.io/pypi/pyversions/dependency_injector.svg\n :target: https://pypi.org/project/dependency-injector/\n :alt: Supported Python versions\n \n.. image:: https://img.shields.io/pypi/implementation/dependency_injector.svg\n :target: https://pypi.org/project/dependency-injector/\n :alt: Supported Python implementations\n\n.. image:: https://pepy.tech/badge/dependency-injector\n :target: https://pepy.tech/project/dependency-injector\n :alt: Downloads\n\n.. image:: https://pepy.tech/badge/dependency-injector/month\n :target: https://pepy.tech/project/dependency-injector\n :alt: Downloads\n\n.. image:: https://pepy.tech/badge/dependency-injector/week\n :target: https://pepy.tech/project/dependency-injector\n :alt: Downloads\n\n.. image:: https://img.shields.io/pypi/wheel/dependency-injector.svg\n :target: https://pypi.org/project/dependency-injector/\n :alt: Wheel\n\n.. image:: https://img.shields.io/github/actions/workflow/status/ets-labs/python-dependency-injector/tests-and-linters.yml?branch=master\n :target: https://github.com/ets-labs/python-dependency-injector/actions\n :alt: Build Status\n\n.. image:: https://coveralls.io/repos/github/ets-labs/python-dependency-injector/badge.svg?branch=master\n :target: https://coveralls.io/github/ets-labs/python-dependency-injector?branch=master\n :alt: Coverage Status\n\nWhat is ``Dependency Injector``?\n================================\n\n``Dependency Injector`` is a dependency injection framework for Python.\n\nIt helps implement the dependency injection principle.\n\nKey features of the ``Dependency Injector``:\n\n- **Providers**. Provides ``Factory``, ``Singleton``, ``Callable``, ``Coroutine``, ``Object``,\n ``List``, ``Dict``, ``Configuration``, ``Resource``, ``Dependency``, and ``Selector`` providers\n that help assemble your objects.\n See `Providers <https://python-dependency-injector.ets-labs.org/providers/index.html>`_.\n- **Overriding**. Can override any provider by another provider on the fly. This helps in testing\n and configuring dev/stage environment to replace API clients with stubs etc. See\n `Provider overriding <https://python-dependency-injector.ets-labs.org/providers/overriding.html>`_.\n- **Configuration**. Reads configuration from ``yaml``, ``ini``, and ``json`` files, ``pydantic`` settings,\n environment variables, and dictionaries.\n See `Configuration provider <https://python-dependency-injector.ets-labs.org/providers/configuration.html>`_.\n- **Resources**. Helps with initialization and configuring of logging, event loop, thread\n or process pool, etc. Can be used for per-function execution scope in tandem with wiring.\n See `Resource provider <https://python-dependency-injector.ets-labs.org/providers/resource.html>`_.\n- **Containers**. Provides declarative and dynamic containers.\n See `Containers <https://python-dependency-injector.ets-labs.org/containers/index.html>`_.\n- **Wiring**. Injects dependencies into functions and methods. Helps integrate with\n other frameworks: Django, Flask, Aiohttp, Sanic, FastAPI, etc.\n See `Wiring <https://python-dependency-injector.ets-labs.org/wiring.html>`_.\n- **Asynchronous**. Supports asynchronous injections.\n See `Asynchronous injections <https://python-dependency-injector.ets-labs.org/providers/async.html>`_.\n- **Typing**. Provides typing stubs, ``mypy``-friendly.\n See `Typing and mypy <https://python-dependency-injector.ets-labs.org/providers/typing_mypy.html>`_.\n- **Performance**. Fast. Written in ``Cython``.\n- **Maturity**. Mature and production-ready. Well-tested, documented, and supported.\n\n.. code-block:: python\n\n from dependency_injector import containers, providers\n from dependency_injector.wiring import Provide, inject\n\n\n class Container(containers.DeclarativeContainer):\n\n config = providers.Configuration()\n\n api_client = providers.Singleton(\n ApiClient,\n api_key=config.api_key,\n timeout=config.timeout,\n )\n\n service = providers.Factory(\n Service,\n api_client=api_client,\n )\n\n\n @inject\n def main(service: Service = Provide[Container.service]) -> None:\n ...\n\n\n if __name__ == \"__main__\":\n container = Container()\n container.config.api_key.from_env(\"API_KEY\", required=True)\n container.config.timeout.from_env(\"TIMEOUT\", as_=int, default=5)\n container.wire(modules=[__name__])\n\n main() # <-- dependency is injected automatically\n\n with container.api_client.override(mock.Mock()):\n main() # <-- overridden dependency is injected automatically\n\nWhen you call the ``main()`` function the ``Service`` dependency is assembled and injected automatically.\n\nWhen you do testing, you call the ``container.api_client.override()`` method to replace the real API\nclient with a mock. When you call ``main()``, the mock is injected.\n\nYou can override any provider with another provider.\n\nIt also helps you in a re-configuring project for different environments: replace an API client\nwith a stub on the dev or stage.\n\nWith the ``Dependency Injector``, object assembling is consolidated in a container. Dependency injections are defined explicitly.\nThis makes it easier to understand and change how an application works.\n\n.. figure:: https://raw.githubusercontent.com/wiki/ets-labs/python-dependency-injector/img/di-readme.svg\n :target: https://github.com/ets-labs/python-dependency-injector\n\nVisit the docs to know more about the\n`Dependency injection and inversion of control in Python <https://python-dependency-injector.ets-labs.org/introduction/di_in_python.html>`_.\n\nInstallation\n------------\n\nThe package is available on the `PyPi`_::\n\n pip install dependency-injector\n\nDocumentation\n-------------\n\nThe documentation is available `here <https://python-dependency-injector.ets-labs.org/>`_.\n\nExamples\n--------\n\nChoose one of the following:\n\n- `Application example (single container) <https://python-dependency-injector.ets-labs.org/examples/application-single-container.html>`_\n- `Application example (multiple containers) <https://python-dependency-injector.ets-labs.org/examples/application-multiple-containers.html>`_\n- `Decoupled packages example (multiple containers) <https://python-dependency-injector.ets-labs.org/examples/decoupled-packages.html>`_\n- `Boto3 example <https://python-dependency-injector.ets-labs.org/examples/boto3.html>`_\n- `Django example <https://python-dependency-injector.ets-labs.org/examples/django.html>`_\n- `Flask example <https://python-dependency-injector.ets-labs.org/examples/flask.html>`_\n- `Aiohttp example <https://python-dependency-injector.ets-labs.org/examples/aiohttp.html>`_\n- `Sanic example <https://python-dependency-injector.ets-labs.org/examples/sanic.html>`_\n- `FastAPI example <https://python-dependency-injector.ets-labs.org/examples/fastapi.html>`_\n- `FastAPI + Redis example <https://python-dependency-injector.ets-labs.org/examples/fastapi-redis.html>`_\n- `FastAPI + SQLAlchemy example <https://python-dependency-injector.ets-labs.org/examples/fastapi-sqlalchemy.html>`_\n\nTutorials\n---------\n\nChoose one of the following:\n\n- `Flask web application tutorial <https://python-dependency-injector.ets-labs.org/tutorials/flask.html>`_\n- `Aiohttp REST API tutorial <https://python-dependency-injector.ets-labs.org/tutorials/aiohttp.html>`_\n- `Asyncio monitoring daemon tutorial <https://python-dependency-injector.ets-labs.org/tutorials/asyncio-daemon.html>`_\n- `CLI application tutorial <https://python-dependency-injector.ets-labs.org/tutorials/cli.html>`_\n\nConcept\n-------\n\nThe framework stands on the `PEP20 (The Zen of Python) <https://www.python.org/dev/peps/pep-0020/>`_ principle:\n\n.. code-block:: bash\n\n Explicit is better than implicit\n\nYou need to specify how to assemble and where to inject the dependencies explicitly.\n\nThe power of the framework is in its simplicity.\n``Dependency Injector`` is a simple tool for the powerful concept.\n\nFrequently asked questions\n--------------------------\n\nWhat is dependency injection?\n - dependency injection is a principle that decreases coupling and increases cohesion\n\nWhy should I do the dependency injection?\n - your code becomes more flexible, testable, and clear \ud83d\ude0e\n\nHow do I start applying the dependency injection?\n - you start writing the code following the dependency injection principle\n - you register all of your application components and their dependencies in the container\n - when you need a component, you specify where to inject it or get it from the container\n\nWhat price do I pay and what do I get?\n - you need to explicitly specify the dependencies\n - it will be extra work in the beginning\n - it will payoff as project grows\n\nHave a question?\n - Open a `Github Issue <https://github.com/ets-labs/python-dependency-injector/issues>`_\n\nFound a bug?\n - Open a `Github Issue <https://github.com/ets-labs/python-dependency-injector/issues>`_\n\nWant to help?\n - |star| Star the ``Dependency Injector`` on the `Github <https://github.com/ets-labs/python-dependency-injector/>`_\n - |new| Start a new project with the ``Dependency Injector``\n - |tell| Tell your friend about the ``Dependency Injector``\n\nWant to contribute?\n - |fork| Fork the project\n - |pull| Open a pull request to the ``develop`` branch\n\n.. _PyPi: https://pypi.org/project/dependency-injector/\n\n.. |star| unicode:: U+2B50 U+FE0F .. star sign1\n.. |new| unicode:: U+1F195 .. new sign\n.. |tell| unicode:: U+1F4AC .. tell sign\n.. |fork| unicode:: U+1F500 .. fork sign\n.. |pull| unicode:: U+2B05 U+FE0F .. pull sign\n",
"bugtrack_url": null,
"license": "BSD New",
"summary": null,
"version": "4.43.0",
"project_urls": null,
"split_keywords": [
"dependency injection",
" di",
" inversion of control",
" ioc",
" factory",
" singleton",
" design patterns",
" flask"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "87433ec1f1795d4075e4b6f01d613602f8b1f199d19ea440ad0ff28cdd7e7d36",
"md5": "c0666bc5d7e6148cb091102445ca11f1",
"sha256": "b0c07c5d85d70314b1f20d5304c09d3ebffca14163e46354ef60fc6584228d87"
},
"downloads": -1,
"filename": "pozalabs_dependency_injector-4.43.0-cp311-cp311-manylinux_2_35_x86_64.whl",
"has_sig": false,
"md5_digest": "c0666bc5d7e6148cb091102445ca11f1",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<4.0,>=3.11",
"size": 5998311,
"upload_time": "2024-07-26T09:29:15",
"upload_time_iso_8601": "2024-07-26T09:29:15.132143Z",
"url": "https://files.pythonhosted.org/packages/87/43/3ec1f1795d4075e4b6f01d613602f8b1f199d19ea440ad0ff28cdd7e7d36/pozalabs_dependency_injector-4.43.0-cp311-cp311-manylinux_2_35_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d348666fcf1d8c8505e0cb259a1187a76eafdd0d11e1aed28a4c595b3463474e",
"md5": "0154d13585395566930b992c04b1a5b3",
"sha256": "b30f53608ba24fdad353bd8a419ce8ade830e58e7da17bc9a3bf9f49fbb225cc"
},
"downloads": -1,
"filename": "pozalabs_dependency_injector-4.43.0.tar.gz",
"has_sig": false,
"md5_digest": "0154d13585395566930b992c04b1a5b3",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.11",
"size": 845014,
"upload_time": "2024-07-26T09:29:17",
"upload_time_iso_8601": "2024-07-26T09:29:17.357757Z",
"url": "https://files.pythonhosted.org/packages/d3/48/666fcf1d8c8505e0cb259a1187a76eafdd0d11e1aed28a4c595b3463474e/pozalabs_dependency_injector-4.43.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-07-26 09:29:17",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "pozalabs-dependency-injector"
}