Python Dependency Injection Framework - PullRequest
       37

Python Dependency Injection Framework

45 голосов
/ 01 октября 2008

Есть ли каркас, эквивалентный Guice (http://code.google.com/p/google-guice) для Python?

Ответы [ 17 ]

1 голос
/ 06 ноября 2017

Я сделал библиотеку, чтобы сделать это https://github.com/ettoreleandrotognoli/python-cdi Я надеюсь, что это помогает

Доступно на pypi: https://pypi.python.org/pypi/pycdi

С его помощью вы можете делать инъекции с python2

import logging
from logging import Logger

from pycdi import Inject, Singleton, Producer
from pycdi.shortcuts import call


@Producer(str, _context='app_name')
def get_app_name():
    return 'PyCDI'


@Singleton(produce_type=Logger)
@Inject(app_name=str, _context='app_name')
def get_logger(app_name):
    return logging.getLogger(app_name)


@Inject(name=(str, 'app_name'), logger=Logger)
def main(name, logger):
    logger.info('I\'m starting...')
    print('Hello World!!!\nI\'m a example of %s' % name)
    logger.debug('I\'m finishing...')


call(main)

И использование подсказок типа из python3

import logging
from logging import Logger

from pycdi import Inject, Singleton, Producer
from pycdi.shortcuts import call


@Producer(_context='app_name')
def get_app_name() -> str:
    return 'PyCDI'


@Singleton()
@Inject(logger_name='app_name')
def get_logger(logger_name: str) -> Logger:
    return logging.getLogger(logger_name)


@Inject(name='app_name')
def main(name: str, logger: Logger):
    logger.info('I\'m starting...')
    print('Hello World!!!\nI\'m a example of %s' % name)
    logger.debug('I\'m finishing...')


call(main)
1 голос
/ 04 мая 2011

Вот небольшой пример контейнера внедрения зависимостей, который выполняет внедрение конструктора на основе имен аргументов конструктора:

http://code.activestate.com/recipes/576609-non-invasive-dependency-injection/

0 голосов
/ 11 марта 2019

Enterprython - это небольшой фреймворк, обеспечивающий внедрение зависимостей, который автоматически строит граф объектов на основе подсказок типа .

0 голосов
/ 02 февраля 2018

Я недавно выпустил аккуратную (ИМХО) микро-библиотеку для DI в python:

https://github.com/suned/serum

0 голосов
/ 18 декабря 2015

Если вы хотите подобную хитрость (новую новую, как говорят), я недавно сделал что-то близкое в Python 3, что лучше всего соответствовало моим простым потребностям в стороннем проекте.

Все, что вам нужно - это @ inject для метода (конечно, __init__). Остальное делается с помощью аннотаций.

from py3njection import inject
from some_package import ClassToInject

class Demo:
    @inject
    def __init__(self, object_to_use: ClassToInject):
        self.dependency = object_to_use

demo = Demo()

https://pypi.python.org/pypi/py3njection

0 голосов
/ 29 апреля 2013

Есть dyject (http://dyject.com), облегченная среда для Python 2 и Python 3, использующая встроенный ConfigParser

0 голосов
/ 09 апреля 2011

Если вы предпочитаете действительно крошечное решение, есть небольшая функция, это просто установщик зависимостей.

https://github.com/liuggio/Ultra-Lightweight-Dependency-Injector-Python

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...