続:インスタンスを指定するとメソッドと引数の一覧を出力する関数
id:bonlifeさんにいただいたコメントをもとに書きなおしてみました。
コメントありがとうございます。
import inspect import string def getLongestKeyLength(dic): return max(map(len, dic.keys())) def formatDictionary(dic): maxkeylength = getLongestKeyLength(dic) format = "" for i in(dic.keys()): space = " " * (maxkeylength - len(i)) format += " %(o)s%(k)s |%(v)s\n" % {'o': space, 'k':i, 'v':dic[i]} return format def printMethodInformation(instance): methods = {} for i in(inspect.getmembers(instance, inspect.ismethod)): argnames = "(" + string.join(inspect.getargspec(i[1])[0], ', ') + ')' methods[i[0]] = argnames print formatDictionary(methods)
発見したこと:
- listの各要素にある関数を適用し、その結果をリストにする→map関数を使う
- 同じ文字を何個も続ける→ '文字'*数字 e.g. 'a'*8 は 'aaaaaaaa'
- string.join
- max()の挙動(テストが不十分かも)
- 数字だけのリストの場合→一番大きい数字を返す
- 文字列の場合→辞書順で一番大きな文字列を返す
このコード、自分で作ったmyFractionクラスのインスタンス相手ではうまく動く。
しかし
printMethodInformation(md5.new())
こういう場合はうまくいかない。
md5はmethod-wrapperとbuilt-in methodは持っていても、methodは持っていないからだ。
さて、この3つは何が違うのだろうか。むむむむ。