2009-01-21 31 views
4

當一個對象有數百種方法時,標籤填充很難使用。通常,有趣的方法是被檢查對象的類而不是其基類定義或覆蓋的方法。如何讓IPython按類組織選項卡完成可能性?

我該如何讓IPython將其製表符完成的可能性分組,以便在被檢查對象的類中定義的方法和屬性首先出現,然後是基類中的那些?

它看起來像無證inspect.classify_class_attrs(cls)函數以及inspect.getmro(cls)給我我需要的大部分信息(這些是最初編寫來實現python的help(object)功能)。

默認情況下,readline按字母順序顯示完成,但用於顯示完成的函數可以用ctypes或Python 2.6及更高版本包含的readline模塊替換。我已經覆蓋了readline的完成顯示,它效果很好。

現在我需要的是一種方法來合併每個類信息(從上面的inspect.*)與每個實例的信息,通過方法解析順序排序結果,漂亮的打印和分頁。

要獲得額外的功勞,最好將所選的自動完成存儲起來,並在下一次嘗試對同一對象進行自動完成時首先顯示最受歡迎的選項。

回答

1

我不認爲這可以輕鬆完成。在任何情況下,Ipython都沒有機制來執行它。

最初我以爲你可以修改Ipython的源來改變順序(例如通過改變genutils.py中的dir2()函數)。然而,它看起來像readline按字母順序排序你傳遞給它的完成,所以這不起作用(至少不是沒有很多努力),儘管你也許可以完全排除基類中的方法。

1

看起來我可以使用readline.set_completion_display_matches_hook([function])(Python 2.6中的新增功能)來顯示結果。完成者將像往常一樣返回可能性列表,但也會在適用的情況下存儲inspect.classify_class_attrs(cls)的結果。 completion_display_matches_hook必須持有對完成者的引用才能檢索最近的完成列表以及我正在查找的分類信息,因爲它只接收其參數中的匹配名稱列表。然後鉤子以令人愉快的方式顯示完成列表。

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顯示完成的方式'的問題。