Skip to main content

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


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.1a0.tar.gz (5.9 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.1a0-py3-none-any.whl (7.3 kB view details)

Uploaded Python 3

File details

Details for the file futile_di_azya0-0.1.1a0.tar.gz.

File metadata

  • Download URL: futile_di_azya0-0.1.1a0.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

Hashes for futile_di_azya0-0.1.1a0.tar.gz
Algorithm Hash digest
SHA256 0169ebfa71a51f9b5b1301999b35e6b29034fed04de9a055bf3ca2054ce819c4
MD5 d43e15f50a01d6f800eda8b42f29ab6d
BLAKE2b-256 8f25953712b7d1f697b8ceb7457dffdcef2bba0827a902143114466ac04a223e

See more details on using hashes here.

File details

Details for the file futile_di_azya0-0.1.1a0-py3-none-any.whl.

File metadata

File hashes

Hashes for futile_di_azya0-0.1.1a0-py3-none-any.whl
Algorithm Hash digest
SHA256 8195041d14236a9035fe9ea3cd2278626640403461f65646d35615c577c9c7db
MD5 8f050ed6bda7f31e52941f337becdd77
BLAKE2b-256 0678d0f05ede16c8b08f642f8a89386caac285395e8bcf76079419c4cd2334d8

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