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-injection
Here's a quick example to get you started:
from dependency_injection 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 names remain supported but now emit deprecation warnings. - API: Re-exported public symbols from the root package for cleaner imports.
- Docs: Added copy-to-clipboard buttons on code examples.
- Tooling: Integrated Codecov for test coverage reporting.
- Tests: Expanded unit test suite to improve coverage.
➡️ Full changelog: GitHub Releases