簡體   English   中英

如何讓IPython按類組織標簽完成的可能性?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM