17
9

More than 5 years have passed since last update.

Pythonでライブラリの処理を上書きする

Posted at

対象の読者

  • Python利用者
  • ソフトウェア開発者
  • ライブラリのバグでシステムがまともに動かせないことが判明し絶望している方

前提条件

  • Python 3.6.3

概要

  • 組み込み/サードパーティのライブラリの挙動などを、プログラムから実行時に動的に書き換えてしまう手法を、Monkey Patchと言います。
  • Pythonでも、importしたモジュールのメンバにオブジェクトを代入することで、実現できます。

実現方法

  • importと同じインデント階層で、importしたモジュールのメンバに新しいメンバを代入する。
  • 例えば、targetmoduleというモジュールに、target_methodというメソッドがあり、その挙動を自作のmy_methodで置き換えたいとします。
    • その場合、以下のように、記述することで、置き換えることができます。
import targetmodule

def my_method(x):
    return x  # do something

targetmodule.target_method = my_method
  • これで、targetmodule.target_method は my_methodを指すようになります。

メリット / デメリット

メリット

  • OSSや他社製品など、修正に合意形成が必要で、すぐには修正を反映できない場合に、その場しのぎができます。

デメリット

  • 上書き対象のモジュールがバージョンアップされると動かなくなったり、望まない挙動が生じるリスクがあります。
  • 依存関係を定義したファイル(requirements.txtなど)を見てもMonkey Patchに気づかないため上書きしていること自体を忘れるリスクがあります。

まとめ

  • 黒魔術感はありますが、緊急時には間違いなく有用です。
  • 他の言語でも Monkey patch というキーワードで検索すればやり方が出てくるので、困ったら試してみてください。
  • ただし、正式に直してMonkey patchを外す、という課題チケットを必ず切って後任者に残しましょう。
17
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
17
9