staticmethod が not callable だと怒られる現象に悩む
静的メソッドを定義し、そのメソッドをそのクラスの中で使用しようとしたら staticmethod が callable でないと怒られた。
>>> class Karhu(object): ... @staticmethod ... def test(): ... return "test" ... x = test() # ... (1) ... Traceback (most recent call last): File "<stdin>", line 1, in ? File "<stdin>", line 5, in Karhu TypeError: 'staticmethod' object is not callable
(1) を入力し終わったときではなく、class の定義が終わったときにエラーが出る。(1) の行を除くとエラーは起きない。
デコレータ staticmethod が callable じゃない、っていうエラーメッセージは違っているんじゃないかと思うが、どうなんだろう。
x = test() を x = Karhu.test() とクラス名で修飾するようにしてみたら怒られなくなった。うーむ。(Karhu.test() がエラーにならなかったのは、すでに定義されていた Karhu クラスがあるからだった。一旦 del Karhu してから実行したら Karhu.test() は "Karhu" が not defined だと怒られた。)
似たような例だが、自分で作った関数をデコレータにした場合は、クラス名を付けなくてもエラーは出ない。
def deco(func): print "deco" return func class Karhu(object): print "karhu 1" @deco # ... (2) def process(): print "process" return "test" print "karhu 2" x = process() # .... (3) print "karhu 3" if __name__ == "__main__": print "main" print Karhu().x
実行すると、
[takeyuki@sunya ~]$ python karhu.py karhu 1 deco karhu 2 process karhu 3 main test
となる。クラス定義の途中、"karhu 1" と "karhu 2" の間でデコレータ deco が呼ばれている様子がわかる。さらにそのデコレータで修飾された関数 process() の呼出しがクラス定義の途中、"karhu 2" と "karhu 3" の間で行われているのもわかる。
で、この karhu.py の (2) を @staticmethod にするとまた callable じゃないと怒られる。
よくわからないなあ。
追記
先の karhu.py で (3) の位置に print process を入れてみると、
<function process at 0xb7e99ed4>
を得る。一方、(2) を @staticmethod に差し替えた場合は
<staticmethod object at 0xb7f4c314>
になる。ここが違いか。function オブジェクトは callable だけど、staticmethod オブジェクト自体は callable じゃないんだ。でもって、クラス定義の外から静的メソッドを見たらどうなるかというと ...
>>> class Karhu(object): ... @staticmethod ... def test(): ... return "test" ... >>> Karhu.test <function test at 0xb7ec2c34>
なるほど function になるんだ。