5

オブジェクトに数百のメソッドがある場合、タブ補完は使いにくいです。多くの場合、興味深いメソッドは、基本クラスではなく、検査対象のオブジェクトのクラスによって定義またはオーバーライドされるメソッドです。

IPythonにタブ補完の可能性をグループ化して、検査対象のオブジェクトのクラスで定義されたメソッドとプロパティが最初に来て、次に基本クラスのメソッドとプロパティが続くようにするにはどうすればよいですか?

文書化されていないinspect.classify_class_attrs(cls)関数とinspect.getmro(cls)、必要な情報のほとんどが提供されているようです(これらは、もともとPythonのhelp(object)機能を実装するために作成されたものです)。

デフォルトでは、readlineは補完をアルファベット順に表示しますが、補完を表示するために使用される関数は、ctypesまたはPython2.6以降に含まれるreadlineモジュールに置き換えることができます。readlineの完了表示を上書きしましたが、うまく機能します。

今必要なのは、クラスごとの情報(inspect.*上記から)をインスタンスごとの情報とマージし、メソッドの解決順序で結果を並べ替え、きれいに印刷してページ分割するメソッドです。

追加のクレジットとして、選択したオートコンプリートを保存し、次に同じオブジェクトでオートコンプリートが試行されたときに最も人気のある選択肢を最初に表示すると便利です。

4

3 に答える 3

5

私はまだ Python 2.6 または 3.0 を使用しておらず、 も持っていないのでreadline.set_completion_display_matches_hook()、ctypes を使用してcompletion_display_func次のように設定できます。

from ctypes import *

rl = cdll.LoadLibrary('libreadline.so')

def completion_display_func(matches, num_matches, max_length):
    print "Hello from Python"
    for i in range(num_matches):
        print matches[i]

COMPLETION_DISPLAY_FUNC = CFUNCTYPE(None, POINTER(c_char_p), c_int, c_int)
hook = COMPLETION_DISPLAY_FUNC(completion_display_func)
ptr = c_void_p.in_dll(rl, 'rl_completion_display_matches_hook')
ptr.value = cast(hook, c_void_p).value

ここで、「タブ」を押して完了すると、独自の関数が補完のリストを出力します。それで、「readline が補完を表示する方法を変更するにはどうすればよいですか」という質問に答えます。

于 2009-01-29T16:22:23.313 に答える
1

これは簡単には達成できないと思います。いずれにせよ、Ipython にはそれを実行するメカニズムはありません。

最初は、Ipython のソースを変更して順序を変更できると考えていました (たとえばdir2()、genutils.py の関数を変更するなど)。ただし、readline は渡された補完をアルファベット順にソートするように見えるため、基本クラスのメソッドを完全に除外することはできますが、これは機能しません (少なくとも、より多くの努力が必要です)。

于 2009-01-21T23:06:42.283 に答える