Spec-Zone.ru › Python 3.9

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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/code.html

Spec-Zone.ru

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