Как мне сделать так, чтобы IPython организовывал возможности завершения табуляции по классам?
Когда у объекта есть сотни методов, заполнение табуляции сложно использовать. Чаще всего интересными являются те методы, которые определены или переопределены классом проверяемого объекта, а не его базовыми классами.
Как я могу заставить IPython сгруппировать его возможности завершения табуляции, чтобы на первом месте были методы и свойства, определенные в классе проверяемого объекта, а затем в базовых классах?
Похоже, без документов inspect.classify_class_attrs(cls)
функционировать вместе с inspect.getmro(cls)
дайте мне большую часть информации, которая мне нужна (они были изначально написаны для реализации Python help(object)
особенность).
По умолчанию readline отображает завершения в алфавитном порядке, но функцию, используемую для отображения завершений, можно заменить на ctypes или модуль readline, включенный в Python 2.6 и выше. Я переопределил отображение завершений readline, и он отлично работает.
Теперь все, что мне нужно, это метод объединения информации для каждого класса (из inspect.*
в соответствии с приведенным выше) с информацией для каждого экземпляра, сортируйте результаты по порядку разрешения метода, довольно распечатать и разбить на страницы.
Для дополнительного кредита было бы неплохо сохранить выбранное автозаполнение и отображать наиболее популярные варианты при первой попытке автозаполнения на том же объекте.
3 ответа
Поскольку я еще не использую 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 отображает завершения".
Похоже, я могу использовать readline.set_completion_display_matches_hook([function])
(новое в Python 2.6) для отображения результатов. Завершитель будет возвращать список возможностей, как обычно, но также будет хранить результаты inspect.classify_class_attrs(cls)
где применимо. completion_display_matches_hook
пришлось бы содержать ссылку на завершитель, чтобы получить самый последний список завершений плюс информацию о классификации, которую я ищу, потому что только получает список имен совпадений в своих аргументах. Затем ловушка отображает список завершений в приятной форме.
Я не думаю, что это может быть достигнуто легко. В Ipython нет механизма для его выполнения в любом случае.
Первоначально я думал, что вы можете изменить источник Ipython, чтобы изменить порядок (например, путем изменения dir2()
функция в genutils.py). Однако, похоже, что readline в алфавитном порядке сортирует завершения, которые вы передаете ему, так что это не сработает (по крайней мере, без особых усилий), хотя вы можете полностью исключить методы из базового класса.