2011年1月20日木曜日

monkey_patch function

django-cmsのmonkeypatch_reverseから忘れないうちにメモ。
pythonで、関数もオブジェクトだから既存のライブラリを書き換えてしまえ。

main.py
from funcs import func

def main():
    func.printStr(u'hello')

if __name__ == '__main__':
    main()
    import monkey #新しい関数でpatch
    main()
funcs/func.py  #元の関数
def printStr(string):
    print u'original', string
monkey_patch.py  #新しい関数
import funcs

def monkey_patch_func():

    def new_printStr(string):
        print u'monkey', string

    print funcs.func.printStr
    funcs.func.old_printStr = funcs.func.printStr   #元の関数を退避
    funcs.func.printStr = new_printStr   #新しい関数を接続
    print funcs.func.printStr

    monkeypatched = False    #新しい関数の接続は1回だけ
    if not monkeypatched:
        monkey_patch_func()
        monkeypatched = True

0 件のコメント:

コメントを投稿