классы интерпретатора кода
Исходный код: 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) -
Вспомогательная функция для запуска цикла «чтение—вычисление—вывод». Она создает новый экземпляр
InteractiveConsoleи устанавливает readfunc в качестве используемого методаInteractiveConsole.raw_input(), если он указан. Если указан local, он передается конструкторуInteractiveConsoleдля использования в качестве пространства имен по умолчанию для цикла интерпретатора. Затем методinteract()экземпляра запускается с banner в качестве используемого баннера, если он указан. Объект консоли удаляется после использования.
-
code.compile_command(source, filename="<input>", symbol="single") -
Эта функция полезна для программ, которые хотят эмулировать основной цикл интерпретатора Python (также известный как цикл «чтение—вычисление—вывод»). Сложная часть заключается в определении того, когда пользователь ввел неполную команду, которую можно дополнить вводом дополнительного текста (по сравнению с полной командой или синтаксической ошибкой). Эта функция почти всегда принимает то же решение, что и основной цикл реального интерпретатора.
source — строка исходного кода; filename — необязательное имя файла, из которого был прочитан исходный код, по умолчанию
'<input>'; и symbol — необязательный начальный символ грамматики, который должен быть либо'single'(по умолчанию), либо'eval'.Возвращает объект кода (такой же, как
compile(source, filename, symbol)) если команда полна и корректна;Noneесли команда неполная; вызываетSyntaxError, если команда полна и содержит синтаксическую ошибку, или вызываетOverflowErrorилиValueError, если команда содержит некорректную литеральную константу.
1. Объекты интерпретатора
-
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). Производные классы должны переопределять этот метод, чтобы обеспечить необходимую обработку вывода.
2. Объекты консоли
Класс InteractiveConsole является подклассом InteractiveInterpreter, поэтому он предлагает все методы объектов интерпретатора, а также следующие дополнения.
-
InteractiveConsole.interact(banner=None) -
Тесно эмулирует интерактивную консоль Python. Необязательный аргумент banner определяет баннер, который будет напечатан перед первой интеракцией; по умолчанию он печатает баннер, похожий на баннер стандартного интерпретатора Python, после чего следует имя класса объекта консоли в скобках (чтобы не спутать это с реальным интерпретатором — поскольку он так близок!).
Изменено в версии 3.4: Чтобы подавить вывод любого баннера, передайте пустую строку.
-
InteractiveConsole.push(line) -
Добавляет строку исходного текста в интерпретатор. Строка не должна иметь конечный символ новой строки; она может иметь внутренние символы новой строки. Строка добавляется в буфер, и метод
runsource()интерпретатора вызывается с объединенным содержимым буфера в качестве исходного кода. Если это указывает, что команда была выполнена или некорректна, буфер сбрасывается; в противном случае команда неполна, и буфер остается таким, каким он был после добавления строки. ВозвращаетTrueесли требуется дополнительный ввод,Falseесли строка была обработана каким-либо способом (это то же самое, что иrunsource()).
-
InteractiveConsole.resetbuffer() -
Удаляет любой необработанный исходный текст из буфера ввода.
-
InteractiveConsole.raw_input(prompt="") -
Выводит приглашение и считывает строку. Возвращаемая строка не включает конечный символ новой строки. Когда пользователь вводит последовательность символов EOF, возбуждается
EOFError. Основная реализация считывает изsys.stdin; подкласс может заменить это другой реализацией.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/code.html