Подтвердить что ты не робот

Инъекционная инфраструктура Python

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

4b9b3361

Ответ 1

Я не использовал его, но Spring Python основывается на Spring и реализует Inversion of Control.

Также существует проект Guice in Python: snake-guice

Ответ 2

Spring Python является ответвлением Java Spring Framework и Spring безопасности, предназначенной для Python. Этот проект в настоящее время содержит следующие функции:

  • Inversion Of Control (инъекция зависимостей) - используйте либо классический XML, либо декоратор python @Object (аналогичный подпроекту Spring JavaConfig), чтобы связать вещи вместе. Хотя формат @Object не идентичен стилю Guice (централизованная проводка и информация о проводке в каждом классе), это ценный способ подключения вашего приложения python.
  • Аспектно-ориентированное программирование - применяют перехватчики в парадигме горизонтального программирования (вместо вертикального наследования ООП) для таких вещей, как транзакции, безопасность и кеширование.
  • DatabaseTemplate. Чтение из базы данных требует монотонного цикла открытия курсоров, чтения строк и закрывающих курсоров вместе с обработчиками исключений. С помощью этого класса шаблонов все, что вам нужно, это SQL-запрос и функция обработки строк. Spring Python делает все остальное.
  • Транзакции базы данных. Объединение нескольких вызовов в базу данных с транзакциями может затруднить чтение кода. Этот модуль предоставляет несколько способов определения транзакций, не усложняя работу.
  • Безопасность - перехватчики безопасности плагинов для блокировки доступа к вашим методам, используя как аутентификацию, так и авторизацию домена.
  • Remoting - легко конвертировать локальное приложение в распределенное. Если вы уже создали клиентский и серверный фрагменты с помощью контейнера IoC, переход из локального в распределенный - это просто изменение конфигурации.
  • Образцы - чтобы продемонстрировать различные функции Spring Python, были созданы некоторые примеры приложений:
    • PetClinic - Spring Пример веб-приложения шаблона Framework был перестроен с нуля, используя веб-контейнеры python, включая: CherryPy. Пойдите, чтобы проверить это, как использовать эту инфраструктуру. (ПРИМЕЧАНИЕ. Другие веб-фреймы python будут добавлены в этот список в будущем).
    • Spring Wiki - Вики - это мощные способы хранения и управления контентом, поэтому мы создали простой демо-версию!
    • Spring Бот - используйте Spring Python для создания крошечного бота для управления IRC-каналом вашего проекта с открытым исходным кодом.

Ответ 3

Мне нравится эта простая и аккуратная структура.

http://pypi.python.org/pypi/injector/

Инъекция зависимостей как формальный шаблон менее полезна в Python, чем на других языках, в первую очередь из-за поддержки ключевого слова аргументы, легкость, с которой объекты могут быть издевались, и ее динамические природа.

Тем не менее, рамки для оказания помощи в этом процессе могут значительно сократить котельной плиты из более крупных применений. То, что инжектор может Помогите. Он автоматически и транзитивно предоставляет аргументы ключевых слов с их значениями. В качестве дополнительного преимущества Инжектор поощряет красиво разделенный код с помощью модуля s.

Будучи вдохновленным Гисом, он не рабски реплицирует свои API. Предоставление Pythonic API превосходит верность.

Ответ 7

Существует несколько проектов Guicey python-inject. Это довольно активно, и LOT меньше кода, чем Spring -python, но опять же, я еще не нашел причины использовать его.

Ответ 8

Если вы просто хотите сделать инъекцию зависимостей в Python, вам не нужна фреймворк. Посмотрите Зависимость от инъекции Путь Python. Это очень быстро и просто, и только c. 50 строк кода.

Ответ 10

Оставлю мои 5 центов здесь:)

https://pypi.python.org/pypi/dependency_injector

"""Pythonic way for Dependency Injection."""

from dependency_injector import providers
from dependency_injector import injections


@providers.DelegatedCallable
def get_user_info(user_id):
    """Return user info."""
    raise NotImplementedError()


@providers.Factory
@injections.inject(get_user_info=get_user_info)
class AuthComponent(object):
    """Some authentication component."""

    def __init__(self, get_user_info):
        """Initializer."""
        self.get_user_info = get_user_info

    def authenticate_user(self, token):
        """Authenticate user by token."""
        user_info = self.get_user_info(user_id=token + '1')
        return user_info


print AuthComponent
print get_user_info


@providers.override(get_user_info)
@providers.DelegatedCallable
def get_user_info(user_id):
    """Return user info."""
    return {'user_id': user_id}


print AuthComponent().authenticate_user(token='abc')
# {'user_id': 'abc1'}

ОБНОВЛЕНО

Некоторое время прошло, и инжектор зависимостей теперь немного отличается. Лучше начать с страницы Dependency Injector GitHub для получения фактических примеров - https://github.com/ets-labs/python-dependency-injector

Ответ 11

Я сделал lib для этого 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)

Ответ 13

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

Ответ 14

Если вам нужен такой вид (новый новый, как они говорят), я недавно сделал что-то близкое в 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