GiveMe is a simple, no-nonsense dependency injection framework for python.
Its features include:
- Simple
register
andinject
decorators to register dependency factories or classes and inject their return value into other function/method arguments. - Painfree configuration for singleton and thread local dependencies
- Injected dependencies can always be overridden by manually passed arguments (great for testing)
Examples and API documentation can be found on ReadTheDocs: https://giveme.readthedocs.io
from giveme import Injector
injector = Injector()
@injector.register
def magic_number():
return 42
@injector.inject
def multiply(n, magic_number):
return n*magic_number
multiply(2)
84
GiveMe has many more advanced options, for more examples and full API documentation please visit https://giveme.readthedocs.io
pip install giveme
Python3.5 and up are supported.
GiveMe has received some improvements in 1.0:
- New
Injector
class withregister
andinject
decorators as instance methods. To support more than one dependency registry in a project. - Module level decoraters
giveme.register
andgiveme.inject
have been deprecated,Injector.register
andInjector.inject
should be used instead. - Vastly improved argument binding in
Injector.inject
which acts in accordance to default python argument binding. Better distinction between injected arguments and manually passed arguments. DependencyNotFoundError
thrown frominject
when an explicitly mapped (e.g. arg_name=’dependency_name’) dependency is not registered or passed in manually for easier debuggingDependencyNotFoundWarning
raised in ambigious cases where an argument is not explicitly mapped to dependency and not passed in manually.
The API is mostly the same. If you were using the module levels decorators in a standard way before:
from giveme import register, inject
@register
def something():
...
@inject
def do_stuff(something):
...
The only change you’ll have to make is to create an instance of Injector
and use its
instance method decorators instead:
from giveme import Injector
injector = Injector()
@injector.register
def something():
...
@injector.inject
def do_stuff(something):
...
You can run the included test suite with pytest
- Clone this repository
- cd path/to/giveme
- Install pytest ->
pip install pytest
- Run the tests ->
pytest tests.py
Pull requests are welcome. Please post any bug reports, questions and suggestions to the issue tracker https://github.com/steinitzu/giveme/issues