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