こんにちは!ぬこすけです!
pythonにはimportlibというモジュールを動的にimportしてくれる組み込みライブラリがあるのですが、それをもっと使いやすくするようなライブラリを自作しました!
このライブラリでスバリ何ができる?
パッケージ名を指定することで、配下のモジュールを動的にimportした上で、モジュールで定義されているクラスオブジェクトを取得することができます!
具体的には次のようなPythonコードを書くことができます!
- ディレクトリ構成
project/
├ example.py
└ validator/
├ validator_a.py
├ validator_b.py
└ validator_c.py
- validator_a.py
class ValidatorA:
# bとcも同様
def valildate(self, input):
# バリデーション処理
- example.py
from autoload.module_loader import ModuleLoader
input = "foo bar baz"
loader = ModuleLoader()
# 自動的にvalidator配下のモジュールを読み込み、ValidatorAなどクラスオブジェクトのリストを返却
validator_classes = loader.load_classes("validator")
try:
# クラスオブジェクトをインスタンス化してメソッド実行
[clazz().validate(input) for clazz in validator_classes]
except:
print("input is invalid!!")
このライブラリ、何がおいしいの?
「まとめて何か処理をかます」ときに威力を発揮します!
具体的な利用シーン例としては次を想定しています。
- ある値をまとめてバリデーションかけるとき(先述のコードの例)
- パイプラインを実装するとき
パイプラインを実装するときは下記のような感じでしょうか。
(並列でデータを取得して加工するイメージです)
- ディレクトリ構成
project/
├ example.py
└ pipelineA/
├ get_data_a.py
└ processing_data_a.py
└ pipelineB/
├ get_data_b.py
└ processing_data_b.py
- example.py
from autoload.module_loader import ModuleLoader
package_names = ("pipelineA", "pipelineB")
loader = ModuleLoader()
# ここらへんは並列処理で
for package_name in package_names:
GetData, ProcessingData = loader.load_classes(package_name)
data = GetData().get()
processed_data = ProcessingData().process(data)
このライブラリ、どう使うの?
使い方はこのページをご参考ください!
なんでこんなライブラリ作ったの?
もともと個人で本のおすすめ度を点数化して紹介するサイトを作っていたのですが、書籍のデータを数パターンのバリデーションをかける必要がありました。
バリデーションパターンごとにモジュール作って良い感じに動的にimportしてバリデーション実行できないかな〜と思って色々ググったのですが、なさそうだったので自作しました!
自作したものの、汎用的に使えそうだなーと思ったのでライブラリとして公開した次第です!
最後にひとこと
まだまだ事足りないこともあるのでcontribution歓迎です!