Fast and easy dependency injection framework.
Project description
Basic usage
Create an injectable
Note: If the class needs dependencies, these will be resolved when the instance is retrieved.
If you wish to inject a singleton, use singleton
decorator.
from injection import singleton
@singleton
class ServiceA:
""" class implementation """
If you wish to inject a new instance each time, use injectable
decorator.
from injection import injectable
@injectable
class ServiceB:
""" class implementation """
If you have a constant (such as a global variable) and wish to register it as an injectable, use set_constant
function.
from injection import set_constant
class ServiceC:
""" class implementation """
service_c = set_constant(ServiceC())
Inject an instance
To inject one or several instances, use inject
decorator.
Don't forget to annotate type of parameter to inject.
from injection import inject
@inject
def some_function(service_a: ServiceA):
""" function implementation """
If inject
decorates a class, it will be applied to the __init__
method.
Especially useful for dataclasses:
Note: Doesn't work with Pydantic
BaseModel
because the signature of the__init__
method doesn't contain the dependencies.
from dataclasses import dataclass
from injection import inject
@inject
@dataclass
class SomeDataClass:
service_a: ServiceA = ...
Get an instance
Example with get_instance
function:
from injection import get_instance
service_a = get_instance(ServiceA)
Example with get_lazy_instance
function:
from injection import get_lazy_instance
lazy_service_a = get_lazy_instance(ServiceA)
# ...
service_a = ~lazy_service_a
Inheritance
In the case of inheritance, you can use the decorator parameter on
to link the injection to one or several other
classes.
Warning: if the child class is in another file, make sure that file is imported before injection.
See load_package
function.
Example with one class:
class AbstractService(ABC):
...
@injectable(on=AbstractService)
class ConcreteService(AbstractService):
...
Example with several classes:
class AbstractService(ABC):
...
class ConcreteService(AbstractService):
...
@injectable(on=(AbstractService, ConcreteService))
class ConcreteServiceOverload(ConcreteService):
...
If a class is registered in a package, and you want to override it, there is the mode
parameter:
@injectable
class InaccessibleService:
...
# ...
@injectable(on=InaccessibleService, mode="override")
class ServiceOverload(InaccessibleService):
...
Recipes
A recipe is a function that tells the injector how to construct the instance to be injected. It is important to specify the return type annotation when defining the recipe.
from injection import injectable
@injectable
def service_d_recipe() -> ServiceD:
""" recipe implementation """
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file python_injection-0.8.5.tar.gz
.
File metadata
- Download URL: python_injection-0.8.5.tar.gz
- Upload date:
- Size: 11.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.10.14 Linux/6.5.0-1022-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 603125ee58bd10d06df7a8405edb661c64cbeeac118720640d63a033ccb59596 |
|
MD5 | c2aa7f3ee6a200851334ae5c53746282 |
|
BLAKE2b-256 | b903e909f8d0e97d1f25d68391daf11f7f4eb185a43389910bfe826dce67a708 |
File details
Details for the file python_injection-0.8.5-py3-none-any.whl
.
File metadata
- Download URL: python_injection-0.8.5-py3-none-any.whl
- Upload date:
- Size: 14.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.10.14 Linux/6.5.0-1022-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7509fc65b5b5ecb544a47d7b43e7224cf4d1fdd5c66e6a8ed2cd8ea2a268806c |
|
MD5 | 2eb777a23dc77c95275f75e5c7ff68d5 |
|
BLAKE2b-256 | b2bf7bb221315a6f050fb561c05a898a6e723ff54e9e873994253402e4e778d4 |