当一个对象有数百种方法时,标签完成很难使用.通常情况下,有趣的方法是被检查对象的类而不是其基类定义或覆盖的方法.
如何让IPython对其选项卡完成的可能性进行分组,以便首先在被检查对象的类中定义的方法和属性,然后是基类中的方法和属性?
它看起来像未记录的inspect.classify_class_attrs(cls)函数以及inspect.getmro(cls)给我提供了我需要的大部分信息(这些信息最初用于实现python的帮助(对象)功能).
默认情况下,readline按字母顺序显示完成,但用于显示完成的函数可以用ctypes或Python 2.6及更高版本中包含的readline模块替换.我已经覆盖了readline的完成显示,效果很好.
现在我需要的是一种方法来合并每个类信息(来自上面的检查.*)和每个实例信息,按方法分辨率顺序排序结果,漂亮的打印和分页.
对于额外的功劳,最好存储所选的自动完成,并在下次尝试对同一对象进行自动完成时首先显示最常用的选项.
解决方法:
由于我还没有使用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显示完成的方式”的问题.