あれもPython,これもPython

Pythonメモ※本サイトはアフィリエイトを利用しています

Pythonで使ってるモジュールに詳しくなりたいので、inspectを使う

ここ、数日間、ガリガリPythonでアプリを書いていました。

今回から珍しくpydoc回りをきちんとやろうと思ったのと、
あんまり日本語情報のないモジュールを使っていたので、
中身を詳しくなるためにinspectというモジュールを使います。

導入

標準モジュールなので、
初めから入ってます。

import inspect

何ができるの?

importされているモジュールから
色々な情報を抜き出せます。

基本

import urllib

# 関数やらクラス名やらを返す
for a in inspect.getmembers(urllib):
    print a[0]

getmembersをすると
(オブジェクト名,オブジェクト)のタプルを格納したリストが帰ってきます。

ちょっと応用

# クラスのみ
inspect.getmembers(urllib,inspect.isclass)

# 関数のみ
inspect.getmembers(urllib,inspect.isfunction)

# メソッドのみ
inspect.getmembers(urllib,inspect.ismethod)

当然帰ってきたリストの中のタプルを使って、
再帰等で掘っていくことも出来ます。

docstringをとってくる

pythonはコードの中にドキュメンテーション用の文字列を埋め込んで置けます。
これを利用して、ドキュメントを作る機能が、pydocやsphinxになるわけです。
で、inspectでこの文字列を取ってくることができます。

inspect.getdoc(urllib)

# 文字列格納もできる
t = inspect.getdoc(urllib)

ソースコードをとってくる

先ほどのdocument stringと同じくらいやりたかったのがこれ。
該当ソース部分をとってきます。

print inspect.getsource(urllib.urlopen)

# 文字列として格納してごにょごにょできる
t = inspect.getsource(urllib.urlopen)

意外と便利?なコードの位置

コードファイルの位置もとってこれます。

inspect.getfile(urllib)

モジュールを変数として扱いたい

で、これモジュールをimportしておくことが前提。
(もっと言うとモジュールがあることが大前提)

この辺りを変数的に扱いたい・・・。
ひとまず、exec,evalで出来はしたけど、
なんかもっといい方法ないかな。

import inspect
import sys

def main(module_name):
    return inspect.getdoc(module_name)


if __name__ == "__main__":
    module_name = sys.argv[1]

    #文字列をコードとして実行
    exec("import "+module_name)
    rtn = eval("main({0)".format(module_name))
    print rtn