Enter a description for this Unimatrix package
Python Inversion-of-Control framework
ioc module provides a framework to dynamically inject dependencies
in Python applications. This intends to reduce coupling between application
and infrastructure, and application and third-party libraries.
In it's most basic usage, dependencies can be declared and invoked using a few simple
calls to functions in the
>>> import ioc >>> >>> req = ioc.require('MY_REQUIREMENT') >>> ioc.provide('MY_REQUIREMENT', 'foo') >>> print(req) 'foo'
The procedure is simple: state your requirement by a symbolic name and call to
ioc.require(), and then provide the requirement using
When an application fails to provide a dependency for a requirement, an exception is raised upon invocation:
>>> import ioc >>> >>> req = ioc.require('MY_REQUIREMENT') >>> print(req) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "requirement.py", line 11, in inner self._setup() File "ioc/requirement.py", line 58, in _setup self._injected = self._provider.resolve(self._names) File "ioc/provider.py", line 33, in resolve raise UnsatisfiedDependency(name) ioc.exc.UnsatisfiedDependency: MY_REQUIREMENT
A call to
ioc.require() will not return the actual dependency (it might not be resolved yet) but a wrapper that mimics the behavior of the (to-be) injected dependency.
>>> import ioc >>> >>> repr(ioc.require('not_resolved')) '<ioc.requirement.DeclaredRequirement object at 0x101db7ac8>'
This might not always be a desirable property, for example with Python C-extensions that enforce datatypes on their input parameters. To solve this problem, the
ioc module provides the
ioc.class_property() decorator. This adds a descriptor to a class that will always return the dependency as it was injected.
>>> import ioc >>> >>> class Foo: ... bar = ioc.class_property('bar') ... >>> >>> ioc.provide('bar', 'baz') >>> >>> repr(Foo.bar) '<property object at 0x101ce5ae8>' >>> >>> foo = Foo() >>> repr(foo.bar) "'baz'"
symboldependencies to an existing iterable.
- Load literal dependencies from environment variables.
- Fix parser loading literal dependencies as symbols.
- Allow default arguments in signatures with
- Add support for
ioc.class_property()a real class property.
- Allow overriding dependencies at runtime.
Release history Release notifications | RSS feed
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.