PythonのGuice( http://code.google.com/p/google-guice )に相当するフレームワークはありますか?
まだ使用していませんが、 Spring Python フレームワークはSpringに基づいており、 Inversion of Control を実装しています。
Pythonプロジェクト: snake-guice にもGuiceがいるようです
Spring Python は、PythonベースのJavaベースのSpring FrameworkとSpring Securityの派生物です。このプロジェクトには現在、次の機能が含まれています。
私はこのシンプルできちんとしたフレームワークが好きです。
http://pypi.python.org/pypi/injector/
Pythonでの正式なパターンとしての依存性注入は、主にキーワード引数のサポート、オブジェクトのモックの容易さ、およびその動的な性質により、他の言語よりも有用ではありません。
とはいえ、このプロセスを支援するためのフレームワークは、大規模なアプリケーションから多くのボイラープレートを取り除くことができます。それはインジェクターが助けることができるところです。自動的に推移的にキーワード引数とその値を提供します。追加の利点として、InjectorはModuleを使用することにより、適切に区分化されたコードを推奨します。
Guiceに触発されながら、そのAPIをしつこく複製しません。 Pythonic APIを提供することは、誠実さよりも優先されます。
モンキーパッチの代わりに、DIが好きです。 http://code.google.com/p/snake-guice/ のような初期のプロジェクトは、法案に適合します。
または、ブログ投稿 Dependency Injection in Python by Dennis Kempin(Aug '08)を参照してください。
pinject( https://github.com/google/pinject )は新しい選択肢です。それはグーグルによって維持されているようで、Guice( https://code.google.com/p/google-guice/ )と同様のパターンに従っていますJava =対応。
多少Guicey python-inject プロジェクトがあります。これはかなりアクティブで、Spring-pythonよりもコードが大幅に少なくなっていますが、繰り返しますが、それを使用する理由はまだわかりません。
ここに私の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
Pythonで依存性注入を行うだけの場合は、フレームワークは必要ありません。 Dependency Injection the Python Way 。を見てください。これは非常に速くて簡単で、わずか50行のコードです。
フレームワークより単純なのは @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
これはフレームワークではないため、インジェクションコンテキストの操作は提供されていませんが、セットアップやワークフローは必要ありません。
開示:私はプロジェクトのメンテナーです
私はこれを行うために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/
非常に小さなソリューションを好む場合は、関数が少しありますが、これは依存関係セッターにすぎません。
https://github.com/liuggio/Ultra-Lightweight-Dependency-Injector-Python
(彼らが言うように新しい新しいもののような)ガイダンスが必要な場合は、最近、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()
Enterprython は、依存性注入を提供する小さなフレームワークであり、オブジェクトグラフを type hints に基づいて自動的に構築します。
Dyject( http://dyject.com )は、Python 2とPython 3の両方を使用する軽量フレームワークです。組み込みのConfigParser
私は最近、PythonでDI用のきちんとした(IMHO)マイクロライブラリをリリースしました。