Enter a description for this Unimatrix package
Project description
Python Inversion-of-Control framework
Synopsis
The 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.
Usage
Basic
In it's most basic usage, dependencies can be declared and invoked using a few simple
calls to functions in the ioc
library.
>>> 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 ioc.provide()
.
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[0])
File "ioc/provider.py", line 33, in resolve
raise UnsatisfiedDependency(name)
ioc.exc.UnsatisfiedDependency: MY_REQUIREMENT
Class properties
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'"
Advanced usage
Changelog
1.3
- Append
symbol
dependencies to an existing iterable. - Load literal dependencies from environment variables.
- Fix parser loading literal dependencies as symbols.
- Allow default arguments in signatures with
ArgumentDependencyInjector
. marshmallow
3.0.0b11 compatibility.
1.2
- Add support for
copy.copy()
andcopy.deepcopy()
. - Allow
default
argument withioc.class_property()
. - Make
ioc.class_property()
a real class property. - Allow overriding dependencies at runtime.
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
File details
Details for the file python-ioc-1.13.0.tar.gz
.
File metadata
- Download URL: python-ioc-1.13.0.tar.gz
- Upload date:
- Size: 26.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/34.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.9 tqdm/4.63.0 importlib-metadata/4.11.3 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.9.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | bcc82161dc32f9f98215c36323287a8ca0e8cb283721c10f9229d7459737b4a4 |
|
MD5 | 36ab2140abe6842abfb7c28d1763f36b |
|
BLAKE2b-256 | 33e6132b1b374d14ff6ff3aa760859d00281005878bf6dd8454f1e6352753a75 |