https://github.com/pyapp-kit/in-n-out
Type-hint-based Python dependency injection you can taste
https://github.com/pyapp-kit/in-n-out
dependency-injection python type-hints typing
Last synced: 10 months ago
JSON representation
Type-hint-based Python dependency injection you can taste
- Host: GitHub
- URL: https://github.com/pyapp-kit/in-n-out
- Owner: pyapp-kit
- License: bsd-3-clause
- Created: 2022-06-27T01:06:04.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2024-12-22T02:57:05.000Z (about 1 year ago)
- Last Synced: 2024-12-25T00:28:31.253Z (about 1 year ago)
- Topics: dependency-injection, python, type-hints, typing
- Language: Python
- Homepage: https://ino.rtfd.io
- Size: 238 KB
- Stars: 12
- Watchers: 3
- Forks: 5
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# in-n-out
[](https://github.com/pyapp-kit/in-n-out/raw/main/LICENSE)
[](https://pypi.org/project/in-n-out)
[](https://python.org)
[](https://github.com/pyapp-kit/in-n-out/actions/workflows/ci.yml)
[](https://app.codecov.io/gh/pyapp-kit/in-n-out)
[](https://codspeed.io/pyapp-kit/in-n-out)
Python dependency injection you can taste.
A lightweight dependency injection and result processing framework
for Python using type hints. Emphasis is on simplicity, ease of use,
and minimal impact on source code.
```python
import in_n_out as ino
class Thing:
def __init__(self, name: str):
self.name = name
# use ino.inject to create a version of the function
# that will retrieve the required dependencies at call time
@ino.inject
def func(thing: Thing):
return thing.name
def give_me_a_thing() -> Thing:
return Thing("Thing")
# register a provider of Thing
ino.register_provider(give_me_a_thing)
print(func()) # prints "Thing"
def give_me_another_thing() -> Thing:
return Thing("Another Thing")
with ino.register_provider(give_me_another_thing, weight=10):
print(func()) # prints "Another Thing"
```
This also supports processing *return* values as well
(injection of intentional side effects):
```python
@ino.inject_processors
def func2(thing: Thing) -> str:
return thing.name
def greet_name(name: str):
print(f"Hello, {name}!")
ino.register_processor(greet_name)
func2(Thing('Bob')) # prints "Hello, Bob!"
```
### Alternatives
Lots of other python DI frameworks exist, here are a few alternatives to consider:
-
-
-
-
-
-
-