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

Uploaded Python 3

File details

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

File metadata

  • Download URL: futile_di_azya0-0.1.1.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.1.tar.gz
Algorithm Hash digest
SHA256 4df466b7b8d7d3cebbdadd35bad8bfcb46888081caf3d3fb36e9a474099036e5
MD5 c2756c719ba0a901abc22d89edf46261
BLAKE2b-256 020b6fb1e96b5d39fee6c9d3f78ef5d87ccdcc4ba7c9f29eb53bedbb06c0632f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for futile_di_azya0-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6acc3f873e000fdeaf6d8f774f972a9bcc1bcc0c7f2bc80e96d6fa5dff263741
MD5 c25f87ef7b69d8c830f88741a2007066
BLAKE2b-256 1cdd7c702a13899afc4b68c57053d35e141e73cfda5de6822a569acd26ff88b1

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