対象の読者
- 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を外す、という課題チケットを必ず切って後任者に残しましょう。