Spec-Zone.ru › Python 3.11

readline — Интерфейс GNU readline

Модуль readline определяет ряд функций для облегчения автодополнения и чтения/записи файлов истории из интерпретатора Python. Этот модуль можно использовать напрямую или через модуль rlcompleter, который поддерживает автодополнение идентификаторов Python в интерактивном приглашении. Настройки, сделанные с помощью этого модуля, влияют на поведение как интерактивного приглашения интерпретатора, так и приглашений, предлагаемых встроенной функцией input().

Настройки сочетаний клавиш readline могут быть сконфигурированы через файл инициализации, обычно .inputrc в вашем домашнем каталоге. См. Файл инициализации Readline в руководстве GNU Readline для получения информации о формате и допустимых конструкциях этого файла, а также о возможностях библиотеки Readline в целом.

Примечание

API базовой библиотеки Readline может быть реализован библиотекой libedit вместо GNU readline. В macOS модуль readline определяет, какая библиотека используется во время выполнения.

Файл конфигурации для libedit отличается от файла конфигурации GNU readline. Если вы программно загружаете строки конфигурации, вы можете проверить текст «libedit» в readline.__doc__ для различения GNU readline и libedit.

Если вы используете эмуляцию editline/libedit readline в macOS, файл инициализации, расположенный в вашем домашнем каталоге, называется .editrc. Например, следующее содержимое ~/.editrc включит сочетания клавиш vi и автодополнение TAB:

python:bind -v
python:bind ^I rl_complete

Файл инициализации

Следующие функции относятся к файлу инициализации и пользовательской конфигурации:

readline.parse_and_bind(string)

Выполняет строку инициализации, предоставленную в аргументе string. Это вызывает rl_parse_and_bind() в базовой библиотеке.

readline.read_init_file([filename])

Выполняет файл инициализации readline. Имя файла по умолчанию — последнее использованное имя файла. Это вызывает rl_read_init_file() в базовой библиотеке.

Буфер строки

Следующие функции работают с буфером строки:

readline.get_line_buffer()

Возвращает текущее содержимое буфера строки (rl_line_buffer в базовой библиотеке).

readline.insert_text(string)

Вставляет текст в буфер строки в позиции курсора. Это вызывает rl_insert_text() в базовой библиотеке, но игнорирует возвращаемое значение.

readline.redisplay()

Изменяет отображаемое на экране содержимое, чтобы отразить текущее содержимое буфера строки. Это вызывает rl_redisplay() в базовой библиотеке.

Файл истории

Следующие функции работают с файлом истории:

readline.read_history_file([filename])

Загружает файл истории readline и добавляет его в список истории. Имя файла по умолчанию — ~/.history. Это вызывает read_history() в базовой библиотеке.

readline.write_history_file([filename])

Сохраняет список истории в файл истории readline, перезаписывая любой существующий файл. Имя файла по умолчанию — ~/.history. Это вызывает write_history() в базовой библиотеке.

readline.append_history_file(nelements[, filename])

Добавляет последние nelements элементов истории в файл. Имя файла по умолчанию — ~/.history. Файл должен уже существовать. Это вызывает append_history() в базовой библиотеке. Эта функция существует только если Python был скомпилирован для версии библиотеки, которая ее поддерживает.

Новая в версии 3.5.

readline.get_history_length()
readline.set_history_length(length)

Устанавливает или возвращает желаемое количество строк для сохранения в файле истории. Функция write_history_file() использует это значение для усечения файла истории, вызывая history_truncate_file() в базовой библиотеке. Отрицательные значения подразумевают неограниченный размер файла истории.

Список истории

Следующие функции работают со глобальным списком истории:

readline.clear_history()

Очищает текущую историю. Это вызывает clear_history() в базовой библиотеке. Функция Python существует только если Python был скомпилирован для версии библиотеки, которая её поддерживает.

readline.get_current_history_length()

Возвращает количество элементов в текущей истории. (Это отличается от get_history_length(), которая возвращает максимальное количество строк, которые будут записаны в файл истории.)

readline.get_history_item(index)

Возвращает текущее содержимое элемента истории в позиции index. Индекс элемента — единичный.

Это вызывает history_get() в базовой библиотеке.

readline.remove_history_item(pos)

Удаляет элемент истории, указанный его позицией, из истории. Позиция — нулевая.

Это вызывает remove_history() в базовой библиотеке.

readline.replace_history_item(pos, line)

Заменяет элемент истории, указанный его позицией, на line. Позиция — нулевая.

Это вызывает replace_history_entry() в базовой библиотеке.

readline.add_history(line)

Добавляет line в буфер истории, как если бы это была последняя набранная строка. Это вызывает add_history() в базовой библиотеке.

readline.set_auto_history(enabled)

Включает или отключает автоматические вызовы add_history() при чтении ввода через readline. Аргумент enabled должен быть булевым значением. Если true, включает авто историю, если false — отключает.

Новая в версии 3.6.

Подробность реализации CPython: Автоистория включена по умолчанию, и изменения в ней не сохраняются между сессиями.

Запускаемые крючки

readline.set_startup_hook([function])

Устанавливает или удаляет функцию, вызываемую обратным вызовом rl_startup_hook базовой библиотеки. Если function указан, он будет использоваться как новая функция-крючок; если опущен или None, любая уже установленная функция удаляется. Крючок вызывается без аргументов непосредственно перед тем, как readline выводит первое приглашение.

readline.set_pre_input_hook([function])

Устанавливает или удаляет функцию, вызываемую обратным вызовом rl_pre_input_hook базовой библиотеки. Если function указан, он будет использоваться как новая функция-крючок; если опущен или None, любая уже установленная функция удаляется. Крючок вызывается без аргументов после вывода первого приглашения и непосредственно перед тем, как readline начнёт читать символы ввода. Эта функция существует только если Python был скомпилирован для версии библиотеки, которая её поддерживает.

Автодополнение

Следующие функции связаны с реализацией пользовательской функции автодополнения слов. Как правило, она активируется клавишей Tab и может предлагать и автоматически завершать вводимое слово. По умолчанию Readline настроен на использование rlcompleter для автодополнения идентификаторов Python в интерактивном интерпретаторе. Если модуль readline должен использоваться с пользовательским автозаполнителем, должны быть установлены другие разделители слов.

readline.set_completer([function])

Установить или удалить функцию автодополнения. Если указана функция function, она будет использована в качестве новой функции автодополнения; если опущена или None, любая уже установленная функция автодополнения будет удалена. Функция автодополнения вызывается как function(text, state), для state в 0, 1, 2, …, пока она не вернёт значение, отличное от строки. Она должна возвращать следующее возможное автодополнение, начинающееся с text.

Установленная функция автодополнения вызывается обратным вызовом entry_func, переданным в rl_completion_matches() в базовой библиотеке. Строка text берётся из первого параметра обратного вызова rl_attempted_completion_function базовой библиотеки.

readline.get_completer()

Получить функцию автодополнения или None если функция автодополнения не была установлена.

readline.get_completion_type()

Получить тип выполняемого автодополнения. Это возвращает переменную rl_completion_type в базовой библиотеке как целое число.

readline.get_begidx()
readline.get_endidx()

Получить начальный или конечный индекс области автодополнения. Эти индексы — аргументы start и end, переданные в обратный вызов rl_attempted_completion_function базовой библиотеки. Значения могут отличаться в одном и том же сценарии редактирования ввода в зависимости от реализации базовой библиотеки C readline. Например, известно, что libedit ведет себя иначе, чем libreadline.

readline.set_completer_delims(string)
readline.get_completer_delims()

Установить или получить разделители слов для автодополнения. Они определяют начало слова, которое должно рассматриваться для автодополнения (область автодополнения). Эти функции обращаются к переменной rl_completer_word_break_characters в базовой библиотеке.

readline.set_completion_display_matches_hook([function])

Установить или удалить функцию отображения автодополнения. Если указана функция function, она будет использована в качестве новой функции отображения автодополнения; если опущена или None, любая уже установленная функция отображения автодополнения будет удалена. Это устанавливает или очищает обратный вызов rl_completion_display_matches_hook в базовой библиотеке. Функция отображения автодополнения вызывается как function(substitution, [matches], longest_match_length) один раз каждый раз, когда нужно отобразить совпадения.

Пример

Следующий пример демонстрирует, как использовать функции чтения и записи истории модуля readline для автоматической загрузки и сохранения файла истории под названием .python_history из домашнего каталога пользователя. Код ниже обычно автоматически выполняется во время интерактивных сеансов из файла PYTHONSTARTUP пользователя.

import atexit
import os
import readline

histfile = os.path.join(os.path.expanduser("~"), ".python_history")
try:
    readline.read_history_file(histfile)
    # default history len is -1 (infinite), which may grow unruly
    readline.set_history_length(1000)
except FileNotFoundError:
    pass

atexit.register(readline.write_history_file, histfile)

Этот код фактически автоматически выполняется, когда Python запускается в интерактивном режиме (см. Настройка Readline).

Следующий пример достигает той же цели, но поддерживает одновременные интерактивные сеансы, только добавляя новую историю.

import atexit
import os
import readline
histfile = os.path.join(os.path.expanduser("~"), ".python_history")

try:
    readline.read_history_file(histfile)
    h_len = readline.get_current_history_length()
except FileNotFoundError:
    open(histfile, 'wb').close()
    h_len = 0

def save(prev_h_len, histfile):
    new_h_len = readline.get_current_history_length()
    readline.set_history_length(1000)
    readline.append_history_file(new_h_len - prev_h_len, histfile)
atexit.register(save, h_len, histfile)

Следующий пример расширяет класс code.InteractiveConsole для поддержки сохранения/восстановления истории.

import atexit
import code
import os
import readline

class HistoryConsole(code.InteractiveConsole):
    def __init__(self, locals=None, filename="<console>",
                 histfile=os.path.expanduser("~/.console-history")):
        code.InteractiveConsole.__init__(self, locals, filename)
        self.init_history(histfile)

    def init_history(self, histfile):
        readline.parse_and_bind("tab: complete")
        if hasattr(readline, "read_history_file"):
            try:
                readline.read_history_file(histfile)
            except FileNotFoundError:
                pass
            atexit.register(self.save_history, histfile)

    def save_history(self, histfile):
        readline.set_history_length(1000)
        readline.write_history_file(histfile)

© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/readline.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API