code — Базовые классы интерпретатора

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


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

class code.InteractiveInterpreter(locals=None)

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

class code.InteractiveConsole(locals=None, filename="<console>")

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

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

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

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

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

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

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

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

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

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

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

  • Входные данные неверны; compile_command() вызвало исключение (SyntaxError или OverflowError). Синтаксически трейсбэк будет напечатан путём вызова метода showsyntaxerror(). runsource() возвращает False.
  • Ввод неполный, требуется больше данных; compile_command() возвращает``None``. runsource() возвращает True.
  • Ввод выполнен; compile_command() возвращенныйa код объекта. Выполнение кода осуществляется путём вызова 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). Производные классы должны переопределять их, чтобы обеспечить необходимую обработку выходных данных.

Интерактивные объекты консоли

Класс: class: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; подкласс может заменить ее другой реализацией.