Содержание страницы
code – Базовые классы интерпретатора¶code – Interpreter base classes
Исходный код: Lib/code.py
Модуль code предоставляет средства для реализации циклов чтение-вычисление-печать в Python. Включены два класса и вспомогательные функции, которые можно использовать для создания приложений, предоставляющих интерактивное приглашение интерпретатора.
- class code.InteractiveInterpreter(locals=None)¶
Этот класс занимается разбором и состоянием интерпретатора (пространство имён пользователя); он не занимается буферизацией ввода, выводом приглашения или именованием входных файлов (имя файла всегда передаётся явно). Необязательный аргумент locals задаёт отображение, используемое в качестве пространства имён, в котором будет выполняться код; по умолчанию это вновь созданный словарь с ключом
'__name__', установленным в'__console__', и ключом'__doc__', установленным вNone.Обратите внимание, что функции и объекты классов, созданные в экземпляре
InteractiveInterpreter, будут принадлежать пространству имён, заданному в locals. Они поддаются сериализации (pickleable) только если locals является пространством имён существующего модуля.
- class code.InteractiveConsole(locals=None, filename='<console>', local_exit=False)¶
Тесно имитирует поведение интерактивного интерпретатора Python. Этот класс основан на
InteractiveInterpreterи добавляет вывод приглашения с помощью знакомыхsys.ps1иsys.ps2, а также буферизацию ввода. Если local_exit истинно,exit()иquit()в консоли не будут вызыватьSystemExit, а вместо этого вернут управление вызывающему коду.Изменено в версии 3.13: Добавлен параметр local_exit.
- code.interact(banner=None, readfunc=None, local=None, exitmsg=None, local_exit=False)¶
Вспомогательная функция для запуска цикла чтение-вычисление-печать. Она создаёт новый экземпляр
InteractiveConsoleи, если указан, устанавливает readfunc в качестве методаInteractiveConsole.raw_input(). Если указан local, он передаётся конструкторуInteractiveConsoleдля использования в качестве пространства имён по умолчанию для цикла интерпретатора. Если указан local_exit, он передаётся конструкторуInteractiveConsole. Затем запускается методinteract()экземпляра, которому передаются banner и exitmsg в качестве баннера и сообщения о выходе, если они указаны. Объект консоли отбрасывается после использования.Изменено в версии 3.6: Добавлен параметр exitmsg.
Изменено в версии 3.13: Добавлен параметр local_exit.
- code.compile_command(source, filename='<input>', symbol='single')¶
Эта функция полезна для программ, которые хотят имитировать главный цикл интерпретатора Python (также известный как цикл чтение-вычисление-печать). Сложность заключается в определении того, когда пользователь ввёл неполную команду, которую можно дополнить, введя ещё текст (в отличие от полной команды или синтаксической ошибки). Эта функция почти всегда принимает то же решение, что и настоящий главный цикл интерпретатора.
source – это строка исходного кода; filename – необязательное имя файла, из которого был прочитан исходный код, по умолчанию
'<input>'; а symbol – необязательный начальный символ грамматики, который должен быть'single'(по умолчанию),'eval'или'exec'.Возвращает объект кода (тот же, что и
compile(source, filename, symbol)), если команда полная и корректная;None, если команда неполная; возбуждаетSyntaxError, если команда полная и содержит синтаксическую ошибку, или возбуждаетOverflowErrorилиValueError, если команда содержит недопустимый литерал.
Объекты интерактивного интерпретатора¶Interactive Interpreter Objects
- 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). Производные классы должны переопределить этот метод, чтобы обеспечить соответствующую обработку вывода по мере необходимости.
Объекты интерактивной консоли¶Interactive Console Objects
Класс 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; подкласс может заменить это на другую реализацию.