[英]How do I make IPython organize tab completion possibilities by class?
當一個對象有數百種方法時,標簽完成很難使用。 通常情況下,有趣的方法是被檢查對象的類而不是其基類定義或覆蓋的方法。
如何讓IPython對其選項卡完成的可能性進行分組,以便首先在被檢查對象的類中定義的方法和屬性,然后是基類中的方法和屬性?
它看起來像未記錄的inspect.classify_class_attrs(cls)
函數以及inspect.getmro(cls)
給我提供了我需要的大部分信息(這些信息最初用於實現python的help(object)
功能)。
默認情況下,readline按字母順序顯示完成,但用於顯示完成的函數可以用ctypes或Python 2.6及更高版本中包含的readline模塊替換。 我已經覆蓋了readline的完成顯示,效果很好。
現在我需要的是一種方法來合並每個類信息(來自上面的inspect.*
)和每個實例信息,按方法分辨率順序排序結果,漂亮的打印和分頁。
對於額外的功勞,最好存儲所選的自動完成,並在下次嘗試對同一對象進行自動完成時首先顯示最常用的選項。
由於我還沒有使用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
現在,當我按“tab”完成時,我自己的功能會打印完成列表。 因此,它回答了“如何更改readline顯示完成的方式”的問題。
我認為這不容易實現。 在任何情況下,Ipython都沒有機制來執行它。
最初我以為你可以修改Ipython的源來改變順序(例如通過改變genutils.py中的dir2()
函數)。 但是它看起來像readline的字母順序排列你傳遞給它的落成量,所以這是不行的(至少在沒有更多的精力 ),但你也許可以排除在基類中的方法完全。
看起來我可以使用readline.set_completion_display_matches_hook([function])
(Python 2.6中的新增readline.set_completion_display_matches_hook([function])
)來顯示結果。 完成者將像往常一樣返回一系列可能性,但也會在適用的情況下存儲inspect.classify_class_attrs(cls)
的結果。 completion_display_matches_hook
必須保存對完成者的引用,以檢索最新的完成列表以及我正在尋找的分類信息,因為它只在其參數中接收匹配名稱列表。 然后鈎子以令人愉悅的方式顯示完成列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.