Spec-Zone.ru › Python 3.5

классы интерпретатора кода

Исходный код: 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)

Вспомогательная функция для запуска цикла «чтение—вычисление—вывод». Она создает новый экземпляр 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, если команда содержит некорректную литеральную константу.

1. Объекты интерпретатора

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

2. Объекты консоли

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

© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/code.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API