2014年09月04日(木) [長年日記]
■ [python] Pythonで部分適用した関数をクラスのメソッドとして動的に追加する
未だにPython 2.7を使っている。
Pythonでは、setattr()を使えばクラスに動的にメソッドを追加できる。
class A(object): pass def f(self, message): print message setattr(A, "g", f) a = A() a.g("g") #=> g
で、f()の引数messageに特定の値を適用した関数をAのメソッドとして追加したかった。Pythonではfunctools.partial()を使うと部分適用した関数を作れるので、
import functools f_with_hello = functools.partial(f, message="hello") setattr(A, "g_with_hello", f_with_hello) a.g_with_hello() #=> TypeError
とすればいいのかなと思ったが、g_with_hello()を呼びだした所で
TypeError: f() takes exactly 2 arguments (1 given)
というエラーになってしまった。ちなみにf_with_hello()は意図通りに動作する。
f_with_hello("self") #=> hello
困ったんだけど、functools.partial()など使わずともf()をlambdaでラップしたらうまくいったのでメモ。
setattr(A, "g_with_world", lambda self: f(self, "world")) a.g_with_world() #=> world