Spec-Zone.ru › Python 3.10

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

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

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

Spec-Zone.ru

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