オブジェクトから様々な情報を取得する inspectモジュール
調べ物をしていたらちょっと面白いモジュールを見つけたのでメモ。
26.10 inspect -- 使用中オブジェクトの情報を取得する
バージョン 2.1 で 新たに追加 された仕様です。
inspectは、モジュール・クラス・メソッド・関数・トレースバック・ フレームオブジェクト・コードオブジェクトなどのオブジェクトから情報を取得 する関数を定義しており、クラスの内容を調べる、メソッドのソースコードを取 得する、関数の引数リストを取得して整形する、トレースバックから必要な情報 だけを取得して表示する、などの処理を行う場合に利用します。
このモジュールの機能は、型チェック・ソースコードの取得・クラス/関数から 情報を取得・インタープリタのスタック情報の調査、の4種類に分類する事がで きます。
今まで型とか属性とか調べるのにtype関数とかdir関数とかisinstance関数とか使ってたけど、これを使うともっと詳しく色々情報を得ることができるらしい。
とりあえずgetmembersって関数を使ってみた。
>>> class C(object): i=0 def __init__(self, x): self.x = x def meth(self): print "you types %s" % self.x >>> import inspect >>> ins = C(1) >>> inspect.getmembers(ins) [('__class__', <class '__main__.C'>), ('__delattr__', <method-wrapper '__delattr__' of C object at 0x04015F70>), ('__dict__', {'x': 1}), ('__doc__', None), ('__format__', <built-in method __format__ of C object at 0x04015F70>), ('__getattribute__', <method-wrapper '__getattribute__' of C object at 0x04015F70>), ('__hash__', <method-wrapper '__hash__' of C object at 0x04015F70>), ('__init__', <bound method C.__init__ of <__main__.C object at 0x04015F70>>), ('__module__', '__main__'), ('__new__', <built-in method __new__ of type object at 0x1E1CB570>), ('__reduce__', <built-in method __reduce__ of C object at 0x04015F70>), ('__reduce_ex__', <built-in method __reduce_ex__ of C object at 0x04015F70>), ('__repr__', <method-wrapper '__repr__' of C object at 0x04015F70>), ('__setattr__', <method-wrapper '__setattr__' of C object at 0x04015F70>), ('__sizeof__', <built-in method __sizeof__ of C object at 0x04015F70>), ('__str__', <method-wrapper '__str__' of C object at 0x04015F70>), ('__subclasshook__', <built-in method __subclasshook__ of type object at 0x0405F200>), ('__weakref__', None), ('i', 0), ('meth', <bound method C.meth of <__main__.C object at 0x04015F70>>), ('x', 1)]
なんか見たこと無い特殊メソッドがたくさん。「特殊メソッド→クラス変数→メソッド→インスタンス変数」って並びになってるぽい。