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.
fromdependency_injectorimportcontainers,providersfromdependency_injector.wiringimportinject,ProvideclassContainer(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,)@injectdefmain(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 automaticallywithcontainer.api_client.override(mock.Mock()):main()# <-- overridden dependency is injected automatically
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>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
📋 Pull Request Information
Original PR: https://github.com/vinta/awesome-python/pull/1591
Author: @rmk135
Created: 8/14/2020
Status: 🔄 Open
Base:
master← Head:master📝 Commits (1)
d91852dAdd Dependency Injector📊 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:Factory,Singleton,Callable,Coroutine,Object,List,Dict,Configuration,Resource,DependencyandSelectorproviders that help assembling your objects. See Providers.yaml&inifiles, environment variables and dictionaries. See Configuration provider.mypy-friendly. See Typing and mypy.Cython.More samples
What's the difference between this Python project and similar ones?
--
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.