code
— Базовые классы интерпретатора¶
Исходный код: Lib/code.py.
Модуль code
предоставляет средства для реализации циклов read-eval-print в 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)¶ Удобная функция для запуска цикла read-eval-print. Она создает новый экземпляр
InteractiveConsole
и устанавливает readfunc для использования в качестве методаInteractiveConsole.raw_input()
, если он предоставлен. Если указано local, оно передается конструкторуInteractiveConsole
для использования в качестве пространства имен по умолчанию для цикла интерпретатора. Затем запускается методinteract()
этого экземпляра с banner и exitmsg, переданными в качестве используемого баннера и сообщения о выходе, если это предусмотрено. После использования объект консоли отбрасывается.Изменено в версии 3.6: Добавлен параметр exitmsg.
-
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
()¶ Удалите любой необработанный исходный текст из входного буфера.