A small dependency injection library
Reason this release was yanked:
python 3.12 was not support
Project description
futile_di
Описание
futile_di - маленькая библиотека для инъекции зависимостей, не привязанной к реализации конкретного фреймворка (вроде Depends из FastAPI).
Допустим у нас есть генератор для контроля цикла жизни сессии:
def get_session():
with create_session() as session:
yield session
Тогда, чтобы получить сессию нам нужно:
- Создавать сильную зависимость
- Хранить созданный генератор на стеке функции-консьюмера
- Вручную вызывать
next(...)для получения сессии
def get_user(generator=get_session()):
session = next(generator)
...
Вместо этого можно использовать механизм инъекции зависимости, который будет делать это "под капотом":
def get_session() -> Session:
with create_session() as session:
yield session
@inject
def get_user(session: Session = Depends(get_session)):
...
На данный момент @inject и Depends поддерживают:
- синхронные функции
- асинхронные функции
- генераторы
- асинхронные генераторы
Реализация
inject - декоратор для синхронной/асинхронной функции. Он ищет класс Depends как среди параметров функции по умолчанию, так и среди переданных значений. Далее он обрабатывает его в зависимости от типа:
class DependsType(Enum):
VALUE = 0,
SYNC = 1,
ASYNC = 2,
GENERATOR = 3,
ASYNC_GENERATOR = 4,
Если это VALUE, то он просто возвращает значение. Если это SYNC или ASYNC, то он вызывает их, получает значение и возвращает его. Если это GENERATOR или ASYNC_GENERATOR, то он получает первое значение, сохраняет генераторы до конца выполнения функции, а потом вызывает ещё один next(...)/await anext(...), для того, чтобы генератор мог завершить свой контекст. При этом, если исключение StopIteration/StopAsyncIteration не было получено, то исключения не будет. В конечном итоге генераторы удаляются со стека.
Тесты
Для futile_di было написано несколько тестов. Запустить их можно через библиотеку pytest из корневой директории командой:
pytest -s
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 futile_di_azya0-0.1.2.tar.gz.
File metadata
- Download URL: futile_di_azya0-0.1.2.tar.gz
- Upload date:
- Size: 5.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd72d2ffb2b424d1443298e4c38a124fb3bb9ecdabbf8e35cdf4fec665a231ee
|
|
| MD5 |
3b65cff1cec2aef8088171f49f6f24b9
|
|
| BLAKE2b-256 |
1545acc2c5866698009ac69d635139a24a5f1790716ec03a20e6df128f1ea746
|
File details
Details for the file futile_di_azya0-0.1.2-py3-none-any.whl.
File metadata
- Download URL: futile_di_azya0-0.1.2-py3-none-any.whl
- Upload date:
- Size: 7.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4e19b012d51f0ad91ad9ebd4ab5cb0273a48764e470697309c0dfd445a75a650
|
|
| MD5 |
cfc51070a68ba7810c0dfb2d50f1326c
|
|
| BLAKE2b-256 |
2f14ca463c374dbd7caa34d666ee6283ff0b77bdaf39157a4722ccdfe8755f97
|