Pythonの「 inspect 」というライブラリをご紹介します。
import inspect
inspect は、名前のとおり「インスペクト」ーーコードの調査を行うためのライブラリです。オブジェクトの状態や関数のふるまいを調べるための関数群が豊富に用意されています。
以下、 inspect の代表的な関数をいくつか見てみます。
inspect.getmembers()
inspect.getmembers はオブジェクトのメンバ一覧を返す関数です。
組み込み関数 dir の高機能版、と考えるとよいかと思います。
dir の場合はオブジェクトのアトリビュート名だけをリストで返しますが、 getmembers はアトリビュートの名前と中身をペアにして返してくれます。
import inspect
# dir が表示するリストのうち最後の5つだけ表示
print dir("test string")[-5:]
# => ['swapcase', 'title', 'translate', 'upper', 'zfill']
# getmembers が表示するリストのうち最後の5つだけ表示
print inspect.getmembers("test string")[-5:]
# => [('swapcase', <function swapcase>),
# ('title', <function title>),
# ('translate', <function translate>),
# ('upper', <function upper>),
# ('zfill', <function zfill>)]
inspect.isfunction()
inspect.isfunction はオブジェクトが関数かどうかを判定する関数です。引数に渡されたオブジェクトが関数であれば True 、そうでなければ False を返します。
import inspect
def hello():
print "hello"
inspect.isfunction(hello) # => True
if inspect.isfunction(hello):
hello() # => hello
# hello が関数だったときだけ呼び出し
ただし、組み込みの関数を isfunction に渡した場合には戻り値は False となります。
組み込みの関数を調べるには、別の関数 isbuiltin を使います。
また、 inspect.isfunction は数ある is__ 関数のうちのひとつです。他にも次のような関数が用意されています。
- ismodule モジュールなら True
- isclass クラスなら True
- ismethod メソッドなら True
- isfunction 関数なら True
- isgeneratorfunction ジェネレータ関数なら True
- isbuiltin 組み込み関数なら True
- isroutine 組み込み関数か自作関数なら True
この他にもまだまだたくさんあるので、もっと知りたい場合は公式ドキュメントにあたってみてください。
inspect.getsource()
inspect.getsource は、関数やメソッドのソースコードを取得するための関数です。
def hello():
print "hello"
inspect.getsource(hello)
# => u'def hello():\n print "hello"\n'
# hello 関数のコードを表示
以上です。
inspect には、この他にもオブジェクトやインタプリタの状態、ソースコードを調べるための関数などが豊富に用意されています。
詳しくは参考ドキュメントをご参照ください。