문제

Guice와 동등한 프레임 워크가 있습니까 (http://code.google.com/p/google-guice) 파이썬의 경우?

도움이 되었습니까?

해결책

나는 그것을 사용하지 않았지만 스프링 파이썬 프레임 워크는 스프링과 도구를 기반으로합니다 제어의 역전.

Python 프로젝트에는 Guice가있는 것으로 보입니다. 뱀 구제

다른 팁

스프링 파이썬 Python을 대상으로 Java 기반 Spring Framework 및 Spring Security의 파생물입니다. 이 프로젝트는 현재 다음과 같은 기능을 포함합니다.

  • 제어 역전 (종속성 주입) - 클래식 XML 또는 Python @object 데코레이터 (Spring Javaconfig 하위 프로젝트와 유사)를 사용하여 물건을 함께 연결하십시오. @object 형식은 Guice 스타일 (각 클래스의 중앙 배선 대 배선 정보)과 동일하지 않지만 Python 앱을 연결하는 귀중한 방법입니다.
  • 측면 지향 프로그래밍 - 트랜잭션, 보안 및 캐싱과 같은 것들에 대한 수평 프로그래밍 패러다임 (수직 OOP 상속 대신)에 인터셉터를 적용하십시오.
  • DatabaseTemplate -Database의 읽기는 예외 처리기와 함께 오프닝 커서, 읽기 행 및 커서 닫기의 단조로운주기가 필요합니다. 이 템플릿 클래스를 사용하면 SQL 쿼리 및 행 처리 기능 만 있으면됩니다. 스프링 파이썬은 나머지를합니다.
  • 데이터베이스 트랜잭션 - 트랜잭션으로 여러 데이터베이스 호출을 래핑하면 코드를 읽기가 어려울 수 있습니다. 이 모듈은 상황을 복잡하게 만들지 않고 거래를 정의하는 여러 가지 방법을 제공합니다.
  • 보안 - 플러그인 보안 인터셉터 인증 및 도메인 인증을 모두 활용하여 방법에 대한 액세스를 잠그기위한 보안 요격기.
  • 원격 - 로컬 응용 프로그램을 분산 응용 프로그램으로 변환하기가 쉽습니다. IOC 컨테이너를 사용하여 이미 클라이언트 및 서버 조각을 빌드 한 경우 로컬에서 분산으로 이동하는 것은 구성 변경입니다.
  • 샘플 - 스프링 파이썬의 다양한 기능을 보여주기 위해 일부 샘플 응용 프로그램이 만들어졌습니다.
    • PETCLINIC- Spring Framework의 샘플 웹 앱은 다음을 포함한 Python 웹 컨테이너를 사용하여 처음부터 재건되었습니다. 체리. 이 프레임 워크 사용 방법의 예를 보려면 확인하십시오. (참고 : 다른 Python 웹 프레임 워크가 향후이 목록에 추가됩니다).
    • Spring Wiki -Wikis는 콘텐츠를 저장하고 관리하는 강력한 방법이므로 데모로 간단한 것을 만들었습니다!
    • 스프링 봇 - 스프링 파이썬을 사용하여 오픈 소스 프로젝트의 IRC 채널을 관리하기 위해 작은 봇을 구축하십시오.

나는이 단순하고 깔끔한 프레임 워크를 좋아합니다.

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

공식 패턴으로서의 종속성 주입은 주로 키워드 인수에 대한 지원, 객체를 조롱 할 수있는 용이성 및 동적 특성으로 인해 다른 언어보다 파이썬에서 유용하지 않습니다.

즉,이 프로세스를 지원하기위한 프레임 워크는 더 큰 응용 프로그램에서 많은 보일러 플레이트를 제거 할 수 있습니다. 그것이 인젝터가 도움을 줄 수있는 곳입니다. 자동으로 그리고 경시적으로 값과 키워드 인수를 제공합니다. 추가 이점으로, 인젝터는 모듈 사용을 통해 잘 구획화 된 코드를 장려합니다.

Guice에서 영감을 얻은 동안 API를 노예로 복제하지는 않습니다. Pythonic API를 제공하는 것은 충실 함을 능가합니다.

monkeypatching의 대안으로 나는 di를 좋아합니다. 다음과 같은 초기 프로젝트 http://code.google.com/p/snake-guice/ 법안에 맞을 수 있습니다.

또는 블로그 게시물을 참조하십시오 파이썬에서 의존성 주입 Dennis Kempin (8 월 8 월).

핀젝트 (https://github.com/google/pinject)는 새로운 대안입니다. Google에 의해 유지되는 것으로 보이며 Guice와 비슷한 패턴을 따릅니다 (https://code.google.com/p/google-guice/), 그것은 자바 상대입니다.

다소 guicey가 있습니다 파이썬 주입 프로젝트. Spring-Python보다 상당히 활동적이고 코드가 훨씬 적지 만 다시는 사용해야 할 이유를 찾지 못했습니다.

파이썬에서 의존성 주입을 원한다면 프레임 워크가 필요하지 않습니다. 살펴보십시오 의존성 주입 파이썬 방식. 정말 빠르고 쉽고 c. 50 줄의 코드.

여기에 내 5 센트를 남길 것입니다 :)

https://pypi.python.org/pypi/delection_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'}

업데이트되었습니다

일정 시간이 지났고 종속성 인젝터는 이제 약간 다릅니다. 실제 예제를 얻으려면 종속성 인젝터 github 페이지에서 시작하는 것이 좋습니다. https://github.com/ets-labs/python-dependency-injector

다음은 생성자 인수 이름을 기반으로 생성자 주입을하는 종속성 분사 컨테이너에 대한 작은 예입니다.

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

나는 이것을하기 위해 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)

프레임 워크보다 간단합니다 @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

프레임 워크가 아니므로 설정 컨텍스트 조작을 제공하지는 않지만 설정 및 시행 워크 플로우가 있습니다.

공개 : 저는 프로젝트 관리자입니다.

정말 작은 솔루션을 선호한다면 약간의 기능이 있습니다. 단지 종속성 세터 일뿐입니다.

https://github.com/liuggio/ultra-lightweight-dependency-injector-python

dyject가 있습니다 (http://dyject.com), 내장 CONFIGPARSER를 사용하는 Python 2 및 Python 3의 경량 프레임 워크

당신이 (그들이 말하는 것처럼 새로운 새로운 새로운) Guice를 원한다면, 나는 최근 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

나는 최근 Python에서 DI를위한 깔끔한 (IMHO) 마이크로 라이브러리를 발표했습니다.

https://github.com/suned/serum

Enterprython 종속성 주입을 제공하는 작은 프레임 워크이며, 힌트를 입력하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top