【问题标题】:How do I make IPython organize tab completion possibilities by class?如何让 IPython 按类组织选项卡完成的可能性?
【发布时间】:2010-10-02 17:03:13
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: python readline ipython


    【解决方案1】:

    由于我还没有使用 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 显示完成的方式”的问题。

    【讨论】:

      【解决方案2】:

      我认为这不是一件容易的事。在任何情况下,Ipython 中都没有执行它的机制。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-13
          • 1970-01-01
          • 2010-12-05
          • 1970-01-01
          • 1970-01-01
          • 2013-07-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多