Spec-Zone.ru › Python 3.12

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

Spec-Zone.ru

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