5

当一个对象有数百个方法时,tab 补全很难使用。有趣的方法通常是被检查对象的类而不是其基类定义或覆盖的方法。

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

它看起来像未记录的inspect.classify_class_attrs(cls)功能以及inspect.getmro(cls)为我提供了我需要的大部分信息(这些最初是为了实现 python 的help(object)功能而编写的)。

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

现在我需要的只是一种将每个类信息(从inspect.*上面)与每个实例信息合并的方法,按方法解析顺序对结果进行排序,漂亮的打印和分页。

为了获得额外的功劳,最好存储选择的自动完成,并在下次尝试对同一对象进行自动完成时首先显示最受欢迎的选择。

4

3 回答 3

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

现在,当我按“制表符”完成时,我自己的函数会打印完成列表。这样就回答了“如何更改 readline 显示完成的方式”的问题。

于 2009-01-29T16:22:23.313 回答
1

I don't think this can be accomplished easily. There's no mechanism in Ipython to perform it in any case.

Initially I had thought you could modify Ipython's source to change the order (eg by changing the dir2() function in genutils.py). However it looks like readline alphabetically sorts the completions you pass to it, so this won't work (at least not without a lot more effort), though you could perhaps exclude methods on the base class completely.

于 2009-01-21T23:06:42.283 回答
1

看起来我可以使用readline.set_completion_display_matches_hook([function])(Python 2.6 中的新功能)来显示结果。完成者会像往常一样返回一个可能性列表,但也会inspect.classify_class_attrs(cls)在适用的地方存储结果。必须持有对完成者的completion_display_matches_hook引用以检索最新的完成列表以及我正在寻找的分类信息,因为仅在其参数中接收匹配名称列表。然后钩子以令人愉悦的方式显示完成列表。

于 2009-01-28T17:04:55.247 回答