code
— Базовые классы интерпретатора¶
Источник: Lib/code.py
Модуль code
предоставляет средства для реализации циклов чтения-вывода-печати в Python. В модуль включены два класса и удобные функции, которые можно использовать для создания приложений, предоставляющих интерактивную подсказку интерпретатора.
- class code.InteractiveInterpreter(locals=None)¶
Этот класс занимается разбором и состоянием интерпретатора (пространство имен пользователя); он не занимается буферизацией ввода, подсказками или именованием входного файла (имя файла всегда передается явно). Необязательный аргумент locals задает отображение для использования в качестве пространства имен, в котором будет выполняться код; по умолчанию это вновь созданный словарь с ключом
'__name__'
, установленным в'__console__'
, и ключом'__doc__'
, установленным вNone
.
- class code.InteractiveConsole(locals=None, filename='<console>', local_exit=False)¶
Близко эмулирует поведение интерактивного интерпретатора Python. Этот класс основан на
InteractiveInterpreter
и добавляет подсказки с помощью привычныхsys.ps1
иsys.ps2
, а также буферизацию ввода. Если local_exit равен true,exit()
иquit()
в консоли не будут вызыватьSystemExit
, а вернутся к вызывающему коду.Изменено в версии 3.13: Добавлен параметр local_exit.
- code.interact(banner=None, readfunc=None, local=None, exitmsg=None, local_exit=False)¶
Удобная функция для запуска цикла read-eval-print. Она создает новый экземпляр
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 (он же цикл 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()¶
Удалите из входного буфера необработанный исходный текст.
- InteractiveConsole.raw_input(prompt='')¶
Напишите запрос и прочитайте строку. Возвращаемая строка не включает завершающую новую строку. Когда пользователь вводит последовательность клавиш EOF, поднимается
EOFError
. Базовая реализация считывает данные изsys.stdin
; подкласс может заменить это другой реализацией.