A dependency injection library for Python.
py-dependency-injection is inspired by the built-in dependency injection system in ASP.NET Core. It provides a lightweight and extensible way to manage dependencies in Python applications. By promoting constructor injection and supporting scoped lifetimes, it encourages clean architecture and makes testable, maintainable code the default.
- Scoped Registrations: Define the lifetime of your dependencies as transient, scoped, or singleton.
- Constructor Injection: Automatically resolve and inject dependencies when creating instances.
- Method Injection: Inject dependencies into methods using a simple decorator.
- Factory Functions: Register factory functions, classes, or lambdas to create dependencies.
- Instance Registration: Register existing instances as dependencies.
- Tag-Based Registration and Resolution: Organize and resolve dependencies based on tags.
- Multiple Containers: Support for using multiple dependency containers.
The library is compatible with the following Python versions:
- 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13
$ pip install py-dependency-injectionHere's a quick example to get you started:
from dependency_injection.container import DependencyContainer # Define an abstract payment gateway interface class PaymentGateway: def charge(self, amount: int, currency: str): raise NotImplementedError() # A concrete implementation using Stripe class StripeGateway(PaymentGateway): def charge(self, amount: int, currency: str): print(f"Charging {amount} {currency} using Stripe...") # A service that depends on the payment gateway class CheckoutService: def __init__(self, gateway: PaymentGateway): self._gateway = gateway def checkout(self): self._gateway.charge(2000, "USD") # e.g. $20.00 # Get the default dependency container container = DependencyContainer.get_instance() # Register StripeGateway as a singleton (shared for the app's lifetime) container.register_singleton(PaymentGateway, StripeGateway) # Register CheckoutService as transient (new instance per resolve) container.register_transient(CheckoutService) # Resolve and use the service checkout = container.resolve(CheckoutService) checkout.checkout()For more advanced usage and examples, please visit our readthedocs page.
py-dependency-injection is released under the GPL 3 license. See LICENSE for more details.
You can find the source code for py-dependency-injection on GitHub.
Latest: 1.0.0-beta.3 (2025-06-14)
- Enhancement: Added
DependencyContainer.configure_default_container_name(...)to support container isolation in parallel tests, even when application code uses a single shared container viaDependencyContainer.get_instance(). - Enhancement: Added
DependencyContainer.clear_instances()as a clean alternative to manually resetting_instancesduring test teardown.
➡️ Full changelog: GitHub Releases