Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@Asayu123

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

対象の読者

  • 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を外す、という課題チケットを必ず切って後任者に残しましょう。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
4
Help us understand the problem. What are the problem?