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 services in Python applications. By promoting constructor injection and supporting scoped lifetimes, it encourages clean architecture and makes testable, maintainable code the default.
This library is implemented in pure Python and has no runtime dependencies.
- Scoped Registrations: Define the lifetime of your services as transient, scoped, or singleton.
- Constructor Injection: Automatically resolve and inject services when creating instances.
- Method Injection: Inject services into methods using a simple decorator.
- Factory Functions: Register factory functions, classes, or lambdas to create services.
- Instance Registration: Register existing instances as services.
- Tag-Based Registration and Resolution: Organize and resolve services based on tags.
- Multiple Containers: Support for using multiple dependency containers.
This library requires Python 3.9 or later.
It is tested and compatible with:
- Python 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 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 MIT license — a permissive license that allows commercial use, modification, distribution, and private use. See LICENSE for full details.
You can find the source code for py-dependency-injection on GitHub.
Latest: 1.0.0-rc.3 (2025-08-xx)
- API polish: Renamed
dependency→service,constructor_args→constructor_kwargs, andfactory_args→factory_kwargs; old keywords still work but emit deprecation warnings. - Documentation: Enabled copy button for code example blocks.
- Tooling: Added test coverage tooling (Codecov).
- Tests: Added more unit tests to increase coverage.
➡️ Full changelog: GitHub Releases