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

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


Модуль code предоставляет средства для реализации циклов read-eval-print в 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)

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

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

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

Вернуться на верх