2014/10/27

Python Tips:オブジェクトのメソッドを調べたい

Pythonでオブジェクトのメソッドを調べる方法をご紹介します。

大きく2つの方法があるかと思います。
  1. 組み込みの関数で調べる
  2. inspect ライブラリの関数で調べる

順に見ていきます。


組み込みの関数で調べる

こちらは特にライブラリを読み込まなくても使える方法です。

組み込みの dir getattr callable 関数を使います。こんな感じ。
# メソッドを調べたいオブジェクト
# 今回は適当に文字列を使う
obj = ""

# アトリビュート一覧のうち
# callable なオブジェクトのみを表示する
for attr in dir(obj):
    if callable(getattr(obj, str(attr))):
        print attr

メソッド一覧をリストで取得したい場合は次のようにするとよいでしょうか。
obj_methods = [attr for attr in dir(obj) if callable(getattr(obj,  str(attr)))]

ただし、 callable はメソッド以外のオブジェクトーーたとえば関数やクラスに対しても True を返すので、その点は注意が必要です。
print callable(list)  # => True
print callable(lambda x: x)  # => True

class MyClass:
    pass

print callable(MyClass)  # => True

純粋にメソッドだけを抽出したい場合は次の inspect を使うやり方でいくのがよろしいかと思います。


inspect ライブラリの関数で調べる

inspect ライブラリの関数を使う方法もあります。

こちらは inspect の getmembers 関数あたりを使います。たとえばこんな感じ。
# ライブラリの読み込み
import inspect

# 対象オブジェクト
obj = ""

# アトリビュート一覧のうち
# isbuiltin が True を返すオブジェクトのみを表示する
# さらに末尾の5件のみに絞り込み
print inspect.getmembers(obj, inspect.isbuiltin)[-5:]
# => [('swapcase', ), ...]
この場合、組み込みのメソッドか関数のみが表示されます。

getmembers 関数は、オブジェクトのアトリビュート一覧を名前と中身をペアにして返す関数です。 第2引数に関数を渡すとその戻り値が True となるものだけにフィルタしてくれます。

isbuiltin 関数は組み込みの関数やメソッドに対して True を返すものです。

isbuiltin を ismethod などに変えると、自作のメソッドのみに絞り込むことも可能です。
print inspect.getmembers(obj, inspect.ismethod)
# => obj の自作メソッド一覧

inspect には他にも細かく判定する関数がいくつも用意されているので、適切な関数を選んで使われるとよろしいかと思います。


以上です。


参考
How do you get list of methods in a python class? - Stack Overflow
python - Finding what methods an object has - Stack Overflow
27.13. inspect — Inspect live objects — Python公式ドキュメント

0 件のコメント: