Документация Python неофициальный перевод
Содержание страницы

code – Базовые классы интерпретатораcode – Interpreter base classes

Исходный код: Lib/code.py


Модуль code предоставляет средства для реализации циклов чтение-вычисление-печать в Python. Включены два класса и вспомогательные функции, которые можно использовать для создания приложений, предоставляющих интерактивное приглашение интерпретатора.

class code.InteractiveInterpreter(locals=None)

Этот класс занимается разбором и состоянием интерпретатора (пространство имён пользователя); он не занимается буферизацией ввода, выводом приглашения или именованием входных файлов (имя файла всегда передаётся явно). Необязательный аргумент locals задаёт отображение, используемое в качестве пространства имён, в котором будет выполняться код; по умолчанию это вновь созданный словарь с ключом '__name__', установленным в '__console__', и ключом '__doc__', установленным в None.

Обратите внимание, что функции и объекты классов, созданные в экземпляре InteractiveInterpreter, будут принадлежать пространству имён, заданному в locals. Они поддаются сериализации (pickleable) только если locals является пространством имён существующего модуля.

class code.InteractiveConsole(locals=None, filename='<console>', local_exit=False)

Тесно имитирует поведение интерактивного интерпретатора Python. Этот класс основан на InteractiveInterpreter и добавляет вывод приглашения с помощью знакомых sys.ps1 и sys.ps2, а также буферизацию ввода. Если local_exit истинно, exit() и quit() в консоли не будут вызывать SystemExit, а вместо этого вернут управление вызывающему коду.

Изменено в версии 3.13: Добавлен параметр local_exit.

code.interact(banner=None, readfunc=None, local=None, exitmsg=None, local_exit=False)

Вспомогательная функция для запуска цикла чтение-вычисление-печать. Она создаёт новый экземпляр InteractiveConsole и, если указан, устанавливает readfunc в качестве метода InteractiveConsole.raw_input(). Если указан local, он передаётся конструктору InteractiveConsole для использования в качестве пространства имён по умолчанию для цикла интерпретатора. Если указан local_exit, он передаётся конструктору InteractiveConsole. Затем запускается метод interact() экземпляра, которому передаются banner и exitmsg в качестве баннера и сообщения о выходе, если они указаны. Объект консоли отбрасывается после использования.

Изменено в версии 3.6: Добавлен параметр exitmsg.

Изменено в версии 3.13: Добавлен параметр local_exit.

code.compile_command(source, filename='<input>', symbol='single')

Эта функция полезна для программ, которые хотят имитировать главный цикл интерпретатора Python (также известный как цикл чтение-вычисление-печать). Сложность заключается в определении того, когда пользователь ввёл неполную команду, которую можно дополнить, введя ещё текст (в отличие от полной команды или синтаксической ошибки). Эта функция почти всегда принимает то же решение, что и настоящий главный цикл интерпретатора.

source – это строка исходного кода; filename – необязательное имя файла, из которого был прочитан исходный код, по умолчанию '<input>'; а symbol – необязательный начальный символ грамматики, который должен быть 'single' (по умолчанию), 'eval' или 'exec'.

Возвращает объект кода (тот же, что и compile(source, filename, symbol)), если команда полная и корректная; None, если команда неполная; возбуждает SyntaxError, если команда полная и содержит синтаксическую ошибку, или возбуждает OverflowError или ValueError, если команда содержит недопустимый литерал.

Объекты интерактивного интерпретатораInteractive Interpreter Objects

InteractiveInterpreter.runsource(source, filename='<input>', symbol='single')

Компилирует и выполняет некоторый исходный код в интерпретаторе. Аргументы те же, что и для compile_command(); по умолчанию для filename используется '<input>', а для symbol'single'. Может произойти одно из нескольких событий:

  • Входные данные некорректны; compile_command() вызвал исключение (SyntaxError или OverflowError). Трассировка синтаксической ошибки будет выведена при вызове метода showsyntaxerror(). runsource() возвращает False.

  • Входные данные неполны и требуется дополнительный ввод; compile_command() вернул None. runsource() возвращает True.

  • Входные данные полны; compile_command() вернул объект кода. Код выполняется вызовом runcode() (который также обрабатывает исключения времени выполнения, за исключением SystemExit). runsource() возвращает False.

Возвращаемое значение можно использовать для решения, использовать ли sys.ps1 или sys.ps2 для вывода приглашения следующей строки.

InteractiveInterpreter.runcode(code)

Выполняет объект кода. Когда возникает исключение, вызывается showtraceback() для отображения трассировки. Перехватываются все исключения, кроме SystemExit, которому разрешено распространяться.

Примечание о KeyboardInterrupt: это исключение может возникнуть в другом месте этого кода и может быть не всегда перехвачено. Вызывающий код должен быть готов обработать его.

InteractiveInterpreter.showsyntaxerror(filename=None)

Отображает только что возникшую синтаксическую ошибку. При этом не отображается стек вызовов, поскольку для синтаксических ошибок его нет. Если указан filename, он вставляется в исключение вместо имени файла по умолчанию, предоставленного синтаксическим анализатором Python, поскольку тот всегда использует '<string>' при чтении из строки. Вывод осуществляется методом write().

InteractiveInterpreter.showtraceback()

Отображает только что произошедшее исключение. Первый элемент стека удаляется, поскольку он находится в реализации объекта интерпретатора. Вывод записывается методом write().

Изменено в версии 3.5: Вместо только основной трассировки отображается полная цепочка трассировки.

InteractiveInterpreter.write(data)

Записывает строку в поток стандартных ошибок (sys.stderr). Производные классы должны переопределить этот метод, чтобы обеспечить соответствующую обработку вывода по мере необходимости.

Объекты интерактивной консолиInteractive Console Objects

Класс InteractiveConsole является подклассом InteractiveInterpreter и, следовательно, предоставляет все методы объектов интерпретатора, а также следующие дополнения.

InteractiveConsole.interact(banner=None, exitmsg=None)

Точно эмулирует интерактивную консоль Python. Необязательный аргумент banner задает баннер, который выводится перед первым взаимодействием; по умолчанию выводится баннер, похожий на тот, что выводится стандартным интерпретатором Python, после которого в скобках указывается имя класса объекта консоли (чтобы не путать с настоящим интерпретатором – настолько он близок к нему!).

Необязательный аргумент exitmsg задает сообщение о выходе, выводимое при завершении. Передайте пустую строку, чтобы подавить сообщение о выходе. Если exitmsg не указан или None, выводится сообщение по умолчанию.

Изменено в версии 3.4: Чтобы не выводить никакой баннер, передайте пустую строку.

Изменено в версии 3.6: Выводить сообщение о выходе при завершении.

InteractiveConsole.push(line)

Передает строку исходного текста интерпретатору. Строка не должна содержать завершающего перевода строки; в ней могут быть внутренние переводы строк. Строка добавляется в буфер, и метод runsource() интерпретатора вызывается с объединенным содержимым буфера в качестве исходного кода. Если это указывает на то, что команда выполнена или некорректна, буфер сбрасывается; в противном случае команда неполна, и буфер остается в том же состоянии, что и после добавления строки. Возвращаемое значение равно True, если требуется дополнительный ввод, False, если строка была обработана каким-либо образом (это то же самое, что runsource()).

InteractiveConsole.resetbuffer()

Удаляет любой необработанный исходный текст из входного буфера.

InteractiveConsole.raw_input(prompt='')

Выводит приглашение и считывает строку. Возвращаемая строка не включает завершающий символ новой строки. Если пользователь вводит последовательность клавиш EOF, возникает EOFError. Базовая реализация читает из sys.stdin; подкласс может заменить это на другую реализацию.