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