A python dependency injection lib
Project description
PyDIT (Python Dependency Injection with Typing)
Description
With PyDit you can use ABC and Protocol to make interfaces and use the power of Dependency Inversion Principle.
PyDit allow your code to depend only abstract things, not the real implementation.
Install
With poetry
poetry add python-pydit
With pip
pip install python-pydit
Usage
Create the PyDit instance:
app/configs/di.py
from pydit import PyDit
pydit = PyDit()
Import the pydit instance and register your project's dependencies:
app/configs/dependencies.py
from typing import Any
from app.configs.di import pydit
from app.adapters.repositories.sqlalchemy.user_repository import SqlalchemyUserRepository
from app.configs.database import get_db_config
def setup_dependencies():
"""
This is only a suggestion, you're free to configure it like you want
"""
dependencies: list[dict[str, Any]] = [
{
"dependency": SqlalchemyUserRepository,
"token": "sqlalchemy_user_repository"
},
{
"dependency": get_db_config,
"token": "database_config",
},
{
"dependency": "HELLO WORLD",
"token": "test"
}
]
for dependency in dependencies:
pydit.add_dependency(dependency["dependency"], dependency.get("token"))
Call the setup_dependencies in the main file
app/main.py
from app.config.di import setup_dependencies()
setup_dependencies()
Injecting a dependency insinde a class
app/domain/user/services/create.py
from typing import cast, Any
from app.configs.di import pydit
# This class can be a Protocol or a clas that inherits from ABC
from app.adapters.repositories.interfaces.user_repositgory import IUserRepository
class CreateUserService:
@pydit.inject()
def user_repository(self) -> IUserRepository:
return cast(IUserRepository, None)
@pydit.inject(token="test")
def other_property(self) -> str:
return ""
def execute(self, data: dict[str, Any]):
self.user_repository.create(data)
# Prints HELLO WORLD
print(self.other_property)
How you can see, we're depending on the intarface IUserRepository, not the real SqlalchemyUserRepository implementation.
Singleton
To use singleton approach, pass true to singleton parameter in inject fn.
from typing import cast, Any
from app.configs.di import pydit
# This class can be a Protocol or a clas that inherits from ABC
from app.adapters.repositories.interfaces.user_repositgory import IUserRepository
class CreateUserService:
@pydit.inject(singleton=True)
def user_repository(self) -> IUserRepository:
return cast(IUserRepository, None)
@pydit.inject(token="test")
def other_property(self) -> str:
return ""
def execute(self, data: dict[str, Any]):
self.user_repository.create(data)
# Prints HELLO WORLD
print(self.other_property)
Features:
- Inject values based on type signature
- Inject values based on inheritance
- Inject values via token
- Resolves function dependencies, calling and injecting the call result
- Singleton support
- Inject values in function calls or class constructor
__init__based on the arguments' signatures
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file python_pydit-1.0.0.tar.gz.
File metadata
- Download URL: python_pydit-1.0.0.tar.gz
- Upload date:
- Size: 10.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.5 CPython/3.12.3 Linux/6.14.0-37-generic
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e716268a3f9886b3ffdbb0b833b000eb2b8f2c84b16df37593c038925d0f50cd
|
|
| MD5 |
70ab95c21a8524c5d61b978448e58ce9
|
|
| BLAKE2b-256 |
8865a15602461a7db6f0bf76460c68a386612a29dab61fac5d560923d144eeca
|
File details
Details for the file python_pydit-1.0.0-py3-none-any.whl.
File metadata
- Download URL: python_pydit-1.0.0-py3-none-any.whl
- Upload date:
- Size: 16.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.5 CPython/3.12.3 Linux/6.14.0-37-generic
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
53fa7ab804cdcede878c640bb3ae6968114fdce5cc54d3e890a4b88da263a453
|
|
| MD5 |
18339e7247f443105660c1101785d1f6
|
|
| BLAKE2b-256 |
7b44c51848b12543ce9fd69352465843199e0597f2842ec59f08a6833986017a
|