Dependency injection for Python
Project description
NOTE: This project is in ALPHA state
jacked ~ python on roids
- A light and easy to use dependency injection framework.
- Inject objects, functions, classes or lists containing any of these.
- Let jacked automatically discover your injectables in a package.
- Loose coupling on the juice!
- Excellent for making your code testable!
Install
pip install jacked
Usage
Inject instances
To inject instances, mark a class with the injectable
decorator:
from jacked import injectable
@injectable
class Cat:
def sound(self):
return 'meow'
You can now inject it in a function anywhere. Place the inject
decorator on
top of the function or method. Let jacked know what type to inject by type
hinting your parameters:
@inject
def what_sound_does_it_make(cat: Cat):
print(cat.sound())
what_sound_does_it_make()
Inject functions
Injecting functions works similarly. Just make sure that your function has the proper type hints:
@injectable
def some_func(x: int, y: int) -> str:
return f'The sum of {x} and {y} is {x + y}'
And like with instances, inject as follows:
@inject
def do_something(func: Callable[[int, int], str]):
print(func(21, 21))
do_something()
Inject classes
Assuming that we have the same Cat
injectable like before, we can inject
that class as follows:
from typing import Type
@inject
def do_something(cat_type: Type[Cat]):
print(cat_type.__name__)
do_something()
Inject lists
Let's suppose that we have the following two injectables of the same parent:
class Animal(ABC):
@abstractmethod
def sound(self):
raise NotImplementedError
@injectable
class Cat(Animal):
def sound(self):
return 'meow'
@injectable
class Dog(Animal):
def sound(self):
return 'bark'
You can now inject them in a list:
@inject
def what_sound_does_it_make(animals: List[Animal]):
for animal in animals:
print(f'The {animal.__class__.__name__} does {animal.sound()}')
what_sound_does_it_make()
You could have also injected a list
of classes or functions by hinting
List[Type[...]]
or List[Callable[...]]
(the ...
replaced by your
injection target).
Singletons
You can annotate an injectable as singleton, meaning that if the injectable is a class, only one instance is ever injected:
@injectable(singleton=True)
class Dog(Animal):
def sound(self):
return 'bark'
Auto discovery
You can let jacked discover injectables in some package using the
discover
function:
from jacked import discover
discover('path/to/your/package')
All python modules in that package are imported and the injectables are registered.
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 jacked-1.0.0a3.tar.gz
.
File metadata
- Download URL: jacked-1.0.0a3.tar.gz
- Upload date:
- Size: 11.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.7.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2d13491f05e126df19e18be7406a43cb89464bc28b22544a913f4107493da47e |
|
MD5 | 2c32d7e279612b098bd58cbeab592efe |
|
BLAKE2b-256 | 40fdcba9492f76fb4ef0b11d61fa9244174fea57131081fff3cd324411d58d84 |
File details
Details for the file jacked-1.0.0a3-py3-none-any.whl
.
File metadata
- Download URL: jacked-1.0.0a3-py3-none-any.whl
- Upload date:
- Size: 15.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.7.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c60b5db33039ebf40af3b86b9bbf8126801afb3f858a21cb5122cfa5322414fd |
|
MD5 | 6f9ec6d703ea67f5739b91adee5eda7a |
|
BLAKE2b-256 | 11ded82585bac9e53970486110738c5057f0a7823f40b18d87871018ed0da361 |