Python依存性注入フレームワーク
-
03-07-2019 - |
質問
Guiceに相当するフレームワークはありますか( http://code.google.com/p/ google-guice )Pythonの場合
解決
使用していませんが、 Spring Python フレームワークはSpringに基づいており、コントロールの反転。
PythonプロジェクトにもGuiceがあるようです: snake-guice
他のヒント
Spring Python は、Pythonを対象としたJavaベースのSpring FrameworkおよびSpring Securityの派生物です。現在、このプロジェクトには次の機能が含まれています。
- 制御の反転(依存性注入)-クラシックXMLまたはPython @Objectを使用デコレータ(Spring JavaConfigサブプロジェクトに類似)は、物事を結び付けます。 @Object形式はGuiceスタイル(集中配線と各クラスの配線情報)とは異なりますが、Pythonアプリを配線するための貴重な方法です。
- アスペクト指向プログラミング-垂直方向ではなく、水平方向のプログラミングパラダイムでインターセプターを適用するOOP継承)トランザクション、セキュリティ、キャッシュなどのこと。
- DatabaseTemplate-データベースからの読み取りには、例外ハンドラーとともに、カーソルを開く、行を読み取る、カーソルを閉じるという単調なサイクルが必要です。このテンプレートクラスで必要なのは、SQLクエリと行処理関数だけです。 Spring Pythonが残りを行います。
- データベーストランザクション-複数のデータベース呼び出しをトランザクションでラップすると、コードが読みにくくなる可能性があります。このモジュールは、物事を複雑にすることなくトランザクションを定義する複数の方法を提供します。
- セキュリティ-認証とドメイン承認の両方を利用して、メソッドへのアクセスをロックダウンするプラグインセキュリティインターセプタ。
- リモート-ローカルアプリケーションを分散アプリケーションに簡単に変換できます。 IoCコンテナーを使用してクライアントとサーバーの部分を既に構築している場合、ローカルから分散への移行は設定の変更にすぎません。
- サンプル-Spring Pythonのさまざまな機能のデモを支援するために、いくつかのサンプルアプリケーションが作成されています。
- PetClinic-Spring FrameworkのサンプルWebアプリは、 CherryPy を含むPython Webコンテナを使用してゼロから再構築されました。このフレームワークの使用方法の例を確認してください。 (注:他のpython Webフレームワークは、将来このリストに追加されます)。
- Spring Wiki-Wikiはコンテンツを保存および管理するための強力な方法であるため、デモとして簡単なものを作成しました。
- Spring Bot-Spring Pythonを使用して小さなボットを構築し、オープンソースプロジェクトのIRCチャネルを管理します。
このシンプルできちんとしたフレームワークが好きです。
http://pypi.python.org/pypi/injector/
フォーマルパターンとしての依存性注入は、PythonよりもPythonではあまり有用ではありません 主にキーワードのサポートにより、他の言語で 引数、オブジェクトをモックできる容易さ、およびその動的 自然。
とはいえ、このプロセスを支援するためのフレームワークは多くのことを取り除くことができます 大きなアプリケーションからのボイラープレートの。それはインジェクターができる場所です 助けて。キーワード引数を自動的かつ推移的に提供します その値で。追加の利点として、インジェクターはうまく奨励します Moduleを使用して区分化されたコード。
Guiceに触発されている一方で、 API。 Pythonic APIを提供することは忠実さよりも優先されます。
monkeypatchingの代替として、DIが好きです。 http://code.google.com/p/snake-guice/などの初期プロジェクトは法案に合う場合があります。
またはブログ投稿 Pythonでの依存性注入、デニスケンピン(08年8月)。
pinject( https://github.com/google/pinject )は新しい代替手段です。 Googleによって維持されているようで、Guiceと同様のパターン( https://code.google.com/p/ google-guice / )、Javaの同等物です。
それに加えて:
ややギザギザの python-inject プロジェクトがあります。これは非常にアクティブで、Spring-pythonよりもコードがはるかに少ないですが、それでも、使用する理由がまだ見つかりません。
Pythonで依存関係の注入を行うだけの場合、フレームワークは必要ありません。 Dependency Injection the Python Way をご覧ください。 。それは本当に素早く簡単で、cだけです。 50行のコード。
ここに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
これは、コンストラクター引数名に基づいてコンストラクター挿入を行う依存性注入コンテナーの小さな例です。
これを行うためのライブラリを作成しました 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-インジェクター-Python
dyject( http://dyject.com )があります。これは、Python 2とPython 3の両方を使用する軽量フレームワークです。組み込みのConfigParser
(彼らが言うような新しいもの)のような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()
最近、PythonのDI用のきちんとした(IMHO)マイクロライブラリをリリースしました。
Enterprython は、依存関係注入を提供する小さなフレームワークで、ヒントを入力。