ここ、数日間、ガリガリ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