当一个对象有数百种方法时,标签完成很难使用.通常情况下,有趣的方法是被检查对象的类而不是其基类定义或覆盖的方法.
如何让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显示完成的方式"的问题.