LoginSignup
9
9

More than 3 years have passed since last update.

【Python】動的にimportできるライブラリを自作しました

Last updated at Posted at 2020-08-28

こんにちは!ぬこすけです!
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歓迎です!

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9