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

Uploaded Python 3

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

Hashes for futile_di_azya0-0.1.2.tar.gz
Algorithm Hash digest
SHA256 bd72d2ffb2b424d1443298e4c38a124fb3bb9ecdabbf8e35cdf4fec665a231ee
MD5 3b65cff1cec2aef8088171f49f6f24b9
BLAKE2b-256 1545acc2c5866698009ac69d635139a24a5f1790716ec03a20e6df128f1ea746

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for futile_di_azya0-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 4e19b012d51f0ad91ad9ebd4ab5cb0273a48764e470697309c0dfd445a75a650
MD5 cfc51070a68ba7810c0dfb2d50f1326c
BLAKE2b-256 2f14ca463c374dbd7caa34d666ee6283ff0b77bdaf39157a4722ccdfe8755f97

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