続:インスタンスを指定するとメソッドと引数の一覧を出力する関数

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つは何が違うのだろうか。むむむむ。