はじめに
ゆっくり歩いていこう。1 nikkieです
Pythonのdependency injectionフレームワークのinjectorを少しだけ触りました。
目次
injector
ちょうぜつ本(『ちょうぜつソフトウェア設計入門』)7章を読んでいて、「PythonではDI(dependency injection)のライブラリにどんなものがあるんだろう」と気になりました。
調べる中で見つかったのがinjector!2
リポジトリはこちら:
READMEのexampleに沿って手を動かしていきます。
動作環境
- Python 3.11.4
- injector 0.21.0
pip install injector
A Quick Example
https://github.com/python-injector/injector/tree/0.21.0#a-quick-example
2つのクラスInnerとOuterがあります。
Outerクラスのインスタンスは、属性にInnerクラスのインスタンスを持ちます。
これが「依存」ですね。
ちょうぜつ本から、インスタンスを作るのに必要な依存は外から与えてもらうようにするのがDIと理解しました。
Quick ExampleではOuterクラスのインスタンスに必要なInnerクラスのインスタンスが外から与えられるということです。
実際、injector.get(Outer)
すると、Innerクラスのインスタンスが与えられてOuterクラスがインスタンス化されています!3
これを可能にしているのが@inject
デコレータ4。
これってオートワイヤリングってことなんじゃないでしょうか。
デコレートした関数の型ヒントを使っているみたいです。
@inject
は@dataclass
デコレータと一緒でも動作する例も示されています。
実行例:
% python quick_example.py outer.inner.forty_two=42 outer_with_dataclass.inner.forty_two=42
A Full Example
https://github.com/python-injector/injector/tree/0.21.0#a-full-example
インメモリのSQLiteデータベースへの接続にinjectorを使う例です。
実行例:
% python full_example.py [('dependency', 'injection'), ('hello', 'world')]
インメモリのデータベースにインサートしたデータが、keyの昇順(=アルファベット順)で取得されました。
DIはここ。
injector = Injector([configure_for_testing, DatabaseModule()]) handler = injector.get(RequestHandler)
injector.get
でRequestHandler
クラスのインスタンスが返されています(handler.get()
でDBのレコードを取得)
すごそうな雰囲気ですが、まだ理解が追いついていない感じです(Injector([configure_for_testing, DatabaseModule()])
ってどういうこと?)
RequestHandler
はsqlite3.Connection
インスタンスに依存sqlite3.Connection
インスタンスを返すのがDatabaseModule
(provider?)DatabaseModule
はConfiguration
に依存
Configuration
インスタンスを返すのがconfigure_for_testing
関数(?)binder.bind
の意味がよく分かっておらず、宿題事項
終わりに
Pythonのdependency injectionフレームワーク injectorのREADMEにある2つの例を触りました。
あるクラスのインスタンス化に必要なインスタンスは、injectorによって型ヒントから与えられるようです。
これが、DI...! ちょうぜつ本にもありましたが、作り方は考えなくてよくなっているのですね。
DIの概念にまだ慣れていないので、完全に理解と言えるくらいまでまだまだ手を動かしたいところです
P.S. 10/20(金) 第7章「依存性注入」のちょうぜつ本_読書py!
次回ちょうぜつ本_読書py(Python使い視点でちょうぜつ本を読む、みんなのアウトプット中心の読書会)は10/20(金)です!
SQLはInjectionできると脆弱性なのでダメですが、DependencyはInjectionできると良いんです。
常連さんも、お久しぶりの方も、はじめましての方もDI(でえあい)に興味ある方、大歓迎です!
ぜひぜひお気軽にお越しください〜
-
TVアニメ「であいもん」公式サイト
↩はっ! #ちょうぜつ本 7章、でえあい(DI。依存性注入)を扱うから、実質"であいもん"では!?https://t.co/0a6AxpzHd1
— nikkie にっきー (@ftnext) 2023年9月23日
読書会に備えて、であいもんの予習もしないと https://t.co/YbbDgPzRm7 - こちらの記事がきっかけです。手を動かしたいな ↩
- https://injector.readthedocs.io/en/latest/api.html#injector.Injector.get↩
- https://injector.readthedocs.io/en/latest/api.html#injector.inject↩