Skip to main content

A small dependency injection library

Project description

futile_di

pip install futile-di-azya0

Описание

futile_di - маленькая библиотека для инъекции зависимостей, не привязанной к реализации конкретного фреймворка (вроде Depends из FastAPI).

Допустим у нас есть генератор для контроля цикла жизни сессии:

def get_session():
    with create_session() as session:
        yield session

Тогда, чтобы получить сессию нам нужно:

  • Создавать сильную зависимость
  • Хранить созданный генератор на стеке функции-консьюмера
  • Вручную вызывать next(...) для получения сессии
def get_user(generator=get_session()):
    session = next(generator)

    ...

Вместо этого можно использовать механизм инъекции зависимости, который будет делать это "под капотом":

from futile_di_azya0 import Depends, inject


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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

futile_di_azya0-0.1.3.tar.gz (6.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

futile_di_azya0-0.1.3-py3-none-any.whl (7.4 kB view details)

Uploaded Python 3

File details

Details for the file futile_di_azya0-0.1.3.tar.gz.

File metadata

  • Download URL: futile_di_azya0-0.1.3.tar.gz
  • Upload date:
  • Size: 6.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for futile_di_azya0-0.1.3.tar.gz
Algorithm Hash digest
SHA256 2eab08c2d2936ab914278984889ade297e4e13cd63334e1e9e5d5913c92b8309
MD5 3e3604226366d9394e08d824d9c279a4
BLAKE2b-256 c0fea068410be42f73636f013f2d0093d0656206e6038fe4261f7fe5dfd219c8

See more details on using hashes here.

File details

Details for the file futile_di_azya0-0.1.3-py3-none-any.whl.

File metadata

File hashes

Hashes for futile_di_azya0-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 004e3d8687f878dc0710dd2ce2d45f7e9b2cb1a26115c9fe3bfcc804946295fd
MD5 14c901bf903b8b44827bff050f0ace39
BLAKE2b-256 1719008764e9280793e5562d41d8ddedcb077ffded2685a3d0213e0ab84ccfb2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page