[PR #1591] Add Dependency Injector #1384

Open
opened 2025-11-06 13:15:10 -06:00 by GiteaMirror · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/vinta/awesome-python/pull/1591
Author: @rmk135
Created: 8/14/2020
Status: 🔄 Open

Base: masterHead: master


📝 Commits (1)

📊 Changes

1 file changed (+1 additions, -0 deletions)

View changed files

📝 README.md (+1 -0)

📄 Description

What is this Python project?

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, 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.
  • 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.
from dependency_injector import containers, providers
from dependency_injector.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.api_key.from_env('API_KEY')
    container.config.timeout.from_env('TIMEOUT')
    container.wire(modules=[sys.modules[__name__]])

    main()  # <-- dependency is injected automatically

    with container.api_client.override(mock.Mock()):
        main()  # <-- overridden dependency is injected automatically

More samples

What's the difference between this Python project and similar ones?

  1. Fast. Implemented in Cython.
  2. Documentation. Has up-to-date documentation and tutorials.
  3. 300 000 downloads monthly. https://pepy.tech/project/dependency-injector
  4. First positions in Google search results for "python dependency injection" query. https://www.google.com/search?q=python+dependency+injection

--

Anyone who agrees with this pull request could submit an Approve review to it.


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/vinta/awesome-python/pull/1591 **Author:** [@rmk135](https://github.com/rmk135) **Created:** 8/14/2020 **Status:** 🔄 Open **Base:** `master` ← **Head:** `master` --- ### 📝 Commits (1) - [`d91852d`](https://github.com/vinta/awesome-python/commit/d91852d4eec678eeaded72ff5b19cf7e7a4337b1) Add Dependency Injector ### 📊 Changes **1 file changed** (+1 additions, -0 deletions) <details> <summary>View changed files</summary> 📝 `README.md` (+1 -0) </details> ### 📄 Description ## What is this Python project? [Dependency Injector](https://github.com/ets-labs/python-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](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`` files, environment variables and dictionaries. See [Configuration provider](https://python-dependency-injector.ets-labs.org/providers/configuration.html). - **Containers**. Provides declarative and dynamic containers. See [Containers](https://python-dependency-injector.ets-labs.org/containers/index.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). - **Wiring**. Injects dependencies into functions and methods. Helps integrating with other frameworks: Django, Flask, Aiohttp, Sanic, FastAPI, etc. See [Wiring](https://python-dependency-injector.ets-labs.org/wiring.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. ```python from dependency_injector import containers, providers from dependency_injector.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.api_key.from_env('API_KEY') container.config.timeout.from_env('TIMEOUT') container.wire(modules=[sys.modules[__name__]]) main() # <-- dependency is injected automatically with container.api_client.override(mock.Mock()): main() # <-- overridden dependency is injected automatically ``` [More samples](https://github.com/ets-labs/python-dependency-injector/tree/master/examples) ## What's the difference between this Python project and similar ones? 1. **Fast**. Implemented in Cython. 2. **Documentation**. Has up-to-date [documentation](http://python-dependency-injector.ets-labs.org/index.html) and [tutorials](http://python-dependency-injector.ets-labs.org/tutorials/index.html). 3. **300 000 downloads monthly**. https://pepy.tech/project/dependency-injector 4. **First positions in Google search results for "python dependency injection" query**. https://www.google.com/search?q=python+dependency+injection -- Anyone who agrees with this pull request could submit an *Approve* review to it. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
GiteaMirror added the pull-request label 2025-11-06 13:15:10 -06:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/awesome-python#1384