オブジェクトから様々な情報を取得する inspectモジュール

調べ物をしていたらちょっと面白いモジュールを見つけたのでメモ。

26.10 inspect -- 使用中オブジェクトの情報を取得する

バージョン 2.1 で 新たに追加 された仕様です。

inspectは、モジュール・クラス・メソッド・関数・トレースバック・ フレームオブジェクト・コードオブジェクトなどのオブジェクトから情報を取得 する関数を定義しており、クラスの内容を調べる、メソッドのソースコードを取 得する、関数の引数リストを取得して整形する、トレースバックから必要な情報 だけを取得して表示する、などの処理を行う場合に利用します。

このモジュールの機能は、型チェック・ソースコードの取得・クラス/関数から 情報を取得・インタープリタのスタック情報の調査、の4種類に分類する事がで きます。

http://www.python.jp/doc/2.5/lib/module-inspect.html

今まで型とか属性とか調べるのに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)]

なんか見たこと無い特殊メソッドがたくさん。「特殊メソッド→クラス変数→メソッド→インスタンス変数」って並びになってるぽい。