当一个对象有数百个方法时,制表符补全很难使用。通常,有趣的方法是由被检查对象的类而不是其基类定义或重写的方法。
如何让 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 显示完成的方式”的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)