Spec-Zone.ru › Python 3.7

code — Базовые классы интерпретатора

Исходный код: Lib/code.py

Модуль 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, exitmsg=None)

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

Изменено в версии 3.6: Добавлен параметр exitmsg.

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

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

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()

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

END_OF_DOCUMENT_MARKER ```
InteractiveConsole.raw_input(prompt="")

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

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

Spec-Zone.ru

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