pyject
What is Pyject?
Pyject is a IocContainer for Python.
It helps implementing the dependency injection principle.
Installation
The package is available on the PyPi:
pip install pyjectt
Examples
- Base
- Non-default types
Base
from abc import ABC, abstractmethod
from typing import List
from pyject import Container
class DuckInterface(ABC):
@abstractmethod
def quack(self):
raise NotImplementedError()
class QuackBehavior(ABC):
@abstractmethod
def quack(self):
raise NotImplementedError()
class Sqeak(QuackBehavior):
def quack(self):
return "Quack_1"
class DuckA(DuckInterface):
def __init__(self, squeak: QuackBehavior):
self._quack_behavior = squeak
def quack(self):
return self._quack_behavior.quack()
class DuckC(DuckInterface):
def quack(self):
return "Quack_2"
container = Container()
container.add_singleton(QuackBehavior, Sqeak)
container.add_transient(DuckInterface, DuckA)
container.add_singleton(DuckInterface, DuckC)
duck = container.get(DuckInterface)
print(duck.quack())
ducks = container.get_all(DuckInterface)
for duck in ducks:
print(duck.quack())
def test2(ducks: List[DuckInterface]):
result_ = ""
for duck in ducks:
result_ += duck.quack()
return result_
assert container.resolve(test2) == "Quack_1Quack_2"
Non-default types
Sequence
def list_typing(ducks: List[DuckInterface]):
result_ = ""
for duck in ducks:
result_ += duck.quack()
return result_
def sequence_typing(ducks: Sequence[DuckInterface]):
result_ = ""
for duck in ducks:
result_ += duck.quack()
return result_
assert container.resolve(list_typing) == "Quack_1Quack_2"
assert container.resolve(sequence_typing) == "Quack_1Quack_2"
Union
def union_typing(quack: Union[QuackBehavior, DuckInterface]):
return quack
def optional_typing(test: Optional[List]):
return test
assert isinstance(container.resolve(union_typing), QuackBehavior)
assert container.resolve(optional_typing) is None
ForwardRef
from pyject.types import ForwardRef
class Test:
def __init__(self, test2: ForwardRef["Test2"]):
self.test2 = test2
def test(self):
return self.test2.test2()
class Test2:
def __init__(self, test: ForwardRef[Test]):
self.test = test
def test2(self):
return "123"
container.add_singleton(Test, Test)
container.add_singleton(Test2, Test2)
test = container.get(Test)
assert isinstance(test, Test)
assert isinstance(test.test2, ForwardRef)
assert isinstance(test.test2.test, ForwardRef)
assert test.test() == "123"
assert test.test() == test.test2.test2()
Iterator
def iterator_typing(ducks: Iterator[DuckInterface]):
result_ = ""
for duck in ducks:
result_ += duck.quack()
return result_
assert container.resolve(iterator_typing) == "Quack_1Quack_2"
Metadata
Release files for pyjectt 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyjectt-0.2.1.tar.gz | 10.1 kB | Details |
Release files / pyjectt-0.2.1.tar.gz
| Download URL | pyjectt-0.2.1.tar.gz |
|---|---|
| Size | 10.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
72492afd06a95e84737d11fe1863f6724638cf3e27b07541df3bc958bf468b29
|
|
BLAKE2b-256 checksum How to use checksums |
de26e391168200013e0cd6eb6156049fced788daae9738dfa54bd4b6d11a5dc8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.1.2 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.2
|