メモの日々


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

2014年09月09日(火) [長年日記]

[c++] Boost.Logを動的リンクするには BOOST_LOG_DYN_LINK マクロが必要みたい

Boost.Logを使ったブログラムをコンパイルしたらリンクエラーになってしまった。ちゃんとlibboost_log.soを指定しているはずなのだが。

検索すると、動的リンクのためには BOOST_LOG_DYN_LINK マクロを定義しないといけないみたいだった。

で説明されているようだが理解していない。

このマクロを定義したらコンパイルできたが、この仕様は困るなー。


2014年09月30日(火) [長年日記]

[math] 実数の整数部分の10進数表示での桁数

初歩的なことだけれどすぐには分からなかったのでメモ。

1以上の実数rの整数部分の10進数表示での桁数は、

で求まる。なぜなら、

だから

であり、自然数Nに対しては10進数表示でN+1桁になる最小の整数だから。

もっと分かりやすく説明できるといいんだけど。