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

Источник: Lib/code.py


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

class code.InteractiveInterpreter(locals=None)

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

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

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

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

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

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

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

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

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

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

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

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