Created by: rmk135
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
andSelector
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
What's the difference between this Python project and similar ones?
- Fast. Implemented in Cython.
- Documentation. Has up-to-date documentation and tutorials.
- 300 000 downloads monthly. https://pepy.tech/project/dependency-injector
- 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.