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

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

Модуль 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)

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

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

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

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

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

30.1.1. Объекты интерактивного интерпретатора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().

InteractiveInterpreter.write(data)

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

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

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

InteractiveConsole.interact(banner=None)

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

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

InteractiveConsole.push(line)

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

InteractiveConsole.resetbuffer()

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

InteractiveConsole.raw_input(prompt="")

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