如何让IPython按类组织标签完成的可能性?

joe*_*ker 4 python readline ipython

当一个对象有数百种方法时,标签完成很难使用.通常情况下,有趣的方法是被检查对象的类而不是其基类定义或覆盖的方法.

如何让IPython对其选项卡完成的可能性进行分组,以便首先在被检查对象的类中定义的方法和属性,然后是基类中的方法和属性?

它看起来像未记录的inspect.classify_class_attrs(cls)函数,并inspect.getmro(cls)提供了我需要的大部分信息(这些信息最初用于实现python的help(object)功能).

默认情况下,readline按字母顺序显示完成,但用于显示完成的函数可以用ctypes或Python 2.6及更高版本中包含的readline模块替换.我已经覆盖了readline的完成显示,效果很好.

现在我只需要一种方法来合并每个类信息(来自inspect.*上面)和每个实例信息,按方法分辨率顺序排序结果,漂亮的打印和分页.

对于额外的功劳,最好存储所选的自动完成,并在下次尝试对同一对象进行自动完成时首先显示最常用的选项.

joe*_*ker 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
Run Code Online (Sandbox Code Playgroud)

现在,当我按"tab"完成时,我自己的功能会打印完成列表.因此,它回答了"如何更改readline显示完成的方式"的问题.


Bri*_*ian 1

我认为这并不容易实现。Ipython 中没有任何机制可以在任何情况下执行它。

最初我以为你可以修改 Ipython 的源代码来更改顺序(例如通过更改dir2()genutils.py 中的函数)。然而,它看起来像 readline 按字母顺序对您传递给它的完成进行排序,因此这将不起作用(至少在没有更多努力的情况下),尽管您可能可以完全排除基类上的方法。