サンプルコード: what_methods in Python

サンプルコード「what_methods」をご紹介します。

from what_methods_python import what

Ruby に「what_methods」というインスペクト用のライブラリがあります。指定したオブジェクトのメソッドのうち、期待した戻り値を返すメソッドだけをリストアップする what? メソッドを提供するライブラリです。

これがなかなかおもしろくてすてきなので、今回はそのPythonバージョンを作ってみました。

使い方を先に見た方がわかりやすいかと思いますので、まずは使い方から。

使い方

使うのは what 関数ひとつです。

第1引数にオブジェクト、第2引数に期待する結果を渡せば、条件を満たすメソッドをリストに格納して返してくれます。

たとえばこんな感じ。

from what_methods_python import what

print what("hello", 5)
# => ['__len__']
# 文字列 "hello" のメソッドのうち、戻り値が 5 と等しいものを調べています。
# 該当するものとして __len__ メソッドが返されました。

print what(3.14, 3)
# => ['__int__', '__long__', '__trunc__']
# 3.14 という数値のメソッドのうち、戻り値が 3 と等しいものを調べています。
# 該当するものとして複数のメソッドが返されました。
# ちなみに、戻り値の等価チェックは == で行っているため、 long なんかも含まれてきます。

メソッドに渡したい引数は、第3引数以降で指定することができます。

print what(["cat", "dog", "elephant"], "dog", 1)
# => ['__getitem__', 'pop']
# メソッドに渡す引数として 1 を指定しています。
# 該当するものとして __getitem__ pop のふたつが返ってきました。

ちなみに、 lengetitem のようにアンダースコア2つが先頭と末尾に付けられたメソッドはいわゆる特殊メソッドです。

直接呼び出すためではなく、何らか別の使い方をするために作られています。たとえば、 len は len() 関数、 getitem はアクセサ [] に相当します。

使い方はひととおりこんな感じです。あとは関数の中身を見てみます。

関数宣言

少し長いので、スクリプトまるごと Gist の方に置きました。

他から import するのではなく直接実行したらテストが走るようになっています。

以上です。

Python 版 what_methods のお話でした。

参考