Python Dependency Injection Framework - PullRequest
       36

Python Dependency Injection Framework

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

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

Ответы [ 17 ]

25 голосов
/ 15 октября 2008

Spring Python является ответвлением от Spring Framework и Spring Security на основе Java, предназначенных для 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 Bot - используйте Spring Python для создания крошечного бота для управления IRC-каналом вашего проекта с открытым исходным кодом.
15 голосов
/ 19 октября 2012

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

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

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

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

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

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

Я не использовал его, но фреймворк Spring Python основан на Spring и реализует инверсию управления .

Похоже, есть проект Guice in Python: snake-guice

9 голосов
/ 08 ноября 2008

Как альтернатива обезьяньей патчи, мне нравится DI. Начинающий проект, такой как http://code.google.com/p/snake-guice/, может соответствовать всем требованиям.

Или посмотрите сообщение в блоге Внедрение зависимостей в Python Деннис Кемпин (август '08).

7 голосов
/ 09 сентября 2013

pinject (https://github.com/google/pinject) - более новая альтернатива. Похоже, она поддерживается Google и следует аналогичному образцу Guice (https://code.google.com/p/google-guice/), это Java-аналог.

6 голосов
/ 01 октября 2008
3 голосов
/ 20 апреля 2010

Есть несколько Guicey python-inject проект. Он довольно активен и кода НАМНОГО меньше, чем Spring-python, но, опять же, я пока не нашел причины его использовать.

2 голосов
/ 06 марта 2016

Оставлю здесь мои 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

2 голосов
/ 03 апреля 2010

Если вы просто хотите внедрить зависимости в Python, вам не нужен фреймворк. Взгляните на Внедрение зависимостей в Python Way . Это действительно быстро и просто, и только в. 50 строк кода.

1 голос
/ 24 февраля 2018

Проще, чем фреймворк, это @autowired декоратор .

Этот декоратор обеспечивает чистую инъекцию зависимостей и поддержку отложенной инициализации.

Получается такой код:

def __init__(self, *, model: Model = None, service: Service = None):
    if model is None:
        model = Model()

    if service is None:
        service = Service()

    self.model = model
    self.service = service
    # actual code

в это:

@autowired
def __init__(self, *, model: Model, service: Service):
    self.model = model
    self.service = service
    # actual code

Это не фреймворк, так что вам нет нужды в настройке и принудительных рабочих процессах, хотя он не обеспечивает манипулирование контекстами внедрения.

Раскрытие информации: я ведущий проекта.

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