Как мне сделать так, чтобы 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 в алфавитном порядке сортирует завершения, которые вы передаете ему, так что это не сработает (по крайней мере, без особых усилий), хотя вы можете полностью исключить методы из базового класса.

Другие вопросы по тегам