web-dev-qa-db-ja.com

Python Dependency Injection Framework

PythonのGuice( http://code.google.com/p/google-guice )に相当するフレームワークはありますか?

45
Mark Roddy

まだ使用していませんが、 Spring Python フレームワークはSpringに基づいており、 Inversion of Control を実装しています。

Pythonプロジェクト: snake-guice にもGuiceがいるようです

14
Matthew Trevor

Spring Python は、PythonベースのJavaベースのSpring FrameworkとSpring Securityの派生物です。このプロジェクトには現在、次の機能が含まれています。

  • Inversion Of Control(Dependency Injection) -クラシックXMLまたはpython @Objectデコレータ(Spring JavaConfigサブプロジェクトと同様))を使用して、物事をワイヤリングします。 @Object形式は、Guiceスタイル(各クラスの集中配線と配線情報)と同じではありません。これは、pythonアプリを配線する貴重な方法です。
  • アスペクト指向プログラミング -トランザクション、セキュリティ、キャッシングなどに対して、垂直プログラミングパラダイム(垂直OOP継承)ではなく)でインターセプターを適用します。
  • DatabaseTemplate-データベースからの読み取りには、例外ハンドラーとともに、カーソルを開く、行を読み取る、カーソルを閉じるという単調なサイクルが必要です。このテンプレートクラスで必要なのは、SQLクエリと行処理関数だけです。春Python残りを行います。
  • データベーストランザクション-複数のデータベース呼び出しをトランザクションでラップすると、コードが読みにくくなる場合があります。このモジュールは、物事を複雑にすることなくトランザクションを定義する複数の方法を提供します。
  • セキュリティ-認証とドメイン承認の両方を利用して、メソッドへのアクセスをロックするプラグインセキュリティインターセプター。
  • リモート処理-ローカルアプリケーションを分散アプリケーションに簡単に変換できます。 IoCコンテナーを使用してクライアントとサーバーの部分を既に構築している場合、ローカルから分散への移行は構成の変更にすぎません。
  • サンプル-Spring Pythonのさまざまな機能を説明するために、いくつかのサンプルアプリケーションが作成されています。
    • PetClinic-Spring FrameworkのサンプルWebアプリは、pythonを含むWebコンテナー: CherryPy を使用してゼロから再構築されました。これの使用例については、こちらをご覧ください。フレームワーク(注:その他python Webフレームワークは将来このリストに追加されます)。
    • Spring Wiki-Wikiはコンテンツを保存および管理する強力な方法であるため、デモとしてシンプルなものを作成しました。
    • Spring Bot-Spring Python=を使用して小さなボットを構築し、オープンソースプロジェクトのIRCチャネルを管理します。
25
gregturn

私はこのシンプルできちんとしたフレームワークが好きです。

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

Pythonでの正式なパターンとしての依存性注入は、主にキーワード引数のサポート、オブジェクトのモックの容易さ、およびその動的な性質により、他の言語よりも有用ではありません。

とはいえ、このプロセスを支援するためのフレームワークは、大規模なアプリケーションから多くのボイラープレートを取り除くことができます。それはインジェクターが助けることができるところです。自動的に推移的にキーワード引数とその値を提供します。追加の利点として、InjectorはModuleを使用することにより、適切に区分化されたコードを推奨します。

Guiceに触発されながら、そのAPIをしつこく複製しません。 Pythonic APIを提供することは、誠実さよりも優先されます。

15

モンキーパッチの代わりに、DIが好きです。 http://code.google.com/p/snake-guice/ のような初期のプロジェクトは、法案に適合します。

または、ブログ投稿 Dependency Injection in Python by Dennis Kempin(Aug '08)を参照してください。

9
user35818

pinject( https://github.com/google/pinject )は新しい選択肢です。それはグーグルによって維持されているようで、Guice( https://code.google.com/p/google-guice/ )と同様のパターンに従っていますJava =対応。

7
phss

多少Guicey python-inject プロジェクトがあります。これはかなりアクティブで、Spring-pythonよりもコードが大幅に少なくなっていますが、繰り返しますが、それを使用する理由はまだわかりません。

3
Y.H Wong

ここに私の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は少し異なります。実際の例を取得するには、Dependency Injector GitHubページから開始することをお勧めします https://github.com/ets-labs/python-dependency-injector

2
Roman Mogylatov

Pythonで依存性注入を行うだけの場合は、フレームワークは必要ありません。 Dependency Injection the Python Way 。を見てください。これは非常に速くて簡単で、わずか50行のコードです。

2
Skilldrick

フレームワークより単純なのは @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

これはフレームワークではないため、インジェクションコンテキストの操作は提供されていませんが、セットアップやワークフローは必要ありません。

開示:私はプロジェクトのメンテナーです

1
Rodrigo Martins

私はこれを行うために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)

以下は、コンストラクター引数名に基づいてコンストラクターインジェクションを実行する依存関係注入コンテナーの小さな例です。

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

1
chiborg

非常に小さなソリューションを好む場合は、関数が少しありますが、これは依存関係セッターにすぎません。

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

0
BillMartus

(彼らが言うように新しい新しいもののような)ガイダンスが必要な場合は、最近、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
Aigrefin

Enterprython は、依存性注入を提供する小さなフレームワークであり、オブジェクトグラフを type hints に基づいて自動的に構築します。

0
Tobias Hermann

Dyject( http://dyject.com )は、Python 2とPython 3の両方を使用する軽量フレームワークです。組み込みのConfigParser

0
djsumdog

私は最近、PythonでDI用のきちんとした(IMHO)マイクロライブラリをリリースしました。

https://github.com/suned/serum