code.md
1> **Источник:** https://python-all.ru/3.8/library/code.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`code`](https://python-all.ru/3.8/library/code.html#module-code) – Базовые классы интерпретатора89**Исходный код:** [Lib/code.py](https://python-all.ru/src/3.8/Lib/code.py)1011---1213Модуль `code` предоставляет средства для реализации циклов чтение-вычисление-печать в Python. Включены два класса и вспомогательные функции, которые можно использовать для создания приложений, предоставляющих интерактивное приглашение интерпретатора.1415#### `class code.InteractiveInterpreter(locals=None)`1617Этот класс занимается разбором и состоянием интерпретатора (пространством имён пользователя); он не занимается буферизацией ввода, подсказками или именованием входных файлов (имя файла всегда передаётся явно). Необязательный аргумент *locals* задаёт словарь, в котором будет выполняться код; по умолчанию создаётся новый словарь с ключом `'__name__'`, установленным в `'__console__'`, и ключом `'__doc__'`, установленным в `None`.1819#### `class code.InteractiveConsole(locals=None, filename="<console>")`2021Тесно эмулирует поведение интерактивного интерпретатора Python. Этот класс основан на [`InteractiveInterpreter`](https://python-all.ru/3.8/library/code.html#code.InteractiveInterpreter) и добавляет подсказки с помощью знакомых `sys.ps1` и `sys.ps2`, а также буферизацию ввода.2223#### `code.interact(banner=None, readfunc=None, local=None, exitmsg=None)`2425Удобная функция для запуска цикла чтение-вычисление-печать. Она создаёт новый экземпляр [`InteractiveConsole`](https://python-all.ru/3.8/library/code.html#code.InteractiveConsole) и, если передан, устанавливает *readfunc* в качестве метода [`InteractiveConsole.raw_input()`](https://python-all.ru/3.8/library/code.html#code.InteractiveConsole.raw_input). Если передан *local*, он передаётся конструктору [`InteractiveConsole`](https://python-all.ru/3.8/library/code.html#code.InteractiveConsole) для использования в качестве пространства имён по умолчанию для цикла интерпретатора. Затем запускается метод [`interact()`](https://python-all.ru/3.8/library/code.html#code.interact) экземпляра, которому передаются *banner* и *exitmsg* в качестве приветствия и сообщения о завершении, если они указаны. Объект консоли после использования отбрасывается.2627Изменено в версии 3.6: Добавлен параметр *exitmsg*.2829#### `code.compile_command(source, filename="<input>", symbol="single")`3031Эта функция полезна для программ, которые хотят имитировать главный цикл интерпретатора Python (также известный как цикл чтение-вычисление-печать). Сложность заключается в определении того, когда пользователь ввёл неполную команду, которую можно дополнить, введя ещё текст (в отличие от полной команды или синтаксической ошибки). Эта функция *почти* всегда принимает то же решение, что и настоящий главный цикл интерпретатора.3233*source* – это строка исходного кода; *filename* – необязательное имя файла, из которого был прочитан исходный код, по умолчанию `'<input>'`; а *symbol* – необязательный начальный символ грамматики, который должен быть `'single'` (по умолчанию), `'eval'` или `'exec'`.3435Возвращает объект кода (тот же, что и `compile(source, filename, symbol)`), если команда полная и корректная; `None`, если команда неполная; возбуждает [`SyntaxError`](https://python-all.ru/3.8/library/exceptions.html#SyntaxError), если команда полная и содержит синтаксическую ошибку, или возбуждает [`OverflowError`](https://python-all.ru/3.8/library/exceptions.html#OverflowError) или [`ValueError`](https://python-all.ru/3.8/library/exceptions.html#ValueError), если команда содержит недопустимый литерал.3637## Объекты интерактивного интерпретатора3839#### `InteractiveInterpreter.runsource(source, filename="<input>", symbol="single")`4041Компилирует и выполняет некоторый исходный код в интерпретаторе. Аргументы те же, что и для [`compile_command()`](https://python-all.ru/3.8/library/code.html#code.compile_command); по умолчанию для *filename* используется `'<input>'`, а для *symbol* – `'single'`. Может произойти одно из нескольких событий:4243- Входные данные некорректны; [`compile_command()`](https://python-all.ru/3.8/library/code.html#code.compile_command) вызвал исключение ([`SyntaxError`](https://python-all.ru/3.8/library/exceptions.html#SyntaxError) или [`OverflowError`](https://python-all.ru/3.8/library/exceptions.html#OverflowError)). Трассировка синтаксической ошибки будет выведена при вызове метода [`showsyntaxerror()`](https://python-all.ru/3.8/library/code.html#code.InteractiveInterpreter.showsyntaxerror). [`runsource()`](https://python-all.ru/3.8/library/code.html#code.InteractiveInterpreter.runsource) возвращает `False`.44- Входные данные неполны и требуется дополнительный ввод; [`compile_command()`](https://python-all.ru/3.8/library/code.html#code.compile_command) вернул `None`. [`runsource()`](https://python-all.ru/3.8/library/code.html#code.InteractiveInterpreter.runsource) возвращает `True`.45- Входные данные полны; [`compile_command()`](https://python-all.ru/3.8/library/code.html#code.compile_command) вернул объект кода. Код выполняется вызовом [`runcode()`](https://python-all.ru/3.8/library/code.html#code.InteractiveInterpreter.runcode) (который также обрабатывает исключения времени выполнения, за исключением [`SystemExit`](https://python-all.ru/3.8/library/exceptions.html#SystemExit)). [`runsource()`](https://python-all.ru/3.8/library/code.html#code.InteractiveInterpreter.runsource) возвращает `False`.4647Возвращаемое значение можно использовать для решения, использовать ли `sys.ps1` или `sys.ps2` для вывода приглашения следующей строки.4849#### `InteractiveInterpreter.runcode(code)`5051Выполняет объект кода. Когда возникает исключение, вызывается [`showtraceback()`](https://python-all.ru/3.8/library/code.html#code.InteractiveInterpreter.showtraceback) для отображения трассировки. Перехватываются все исключения, кроме [`SystemExit`](https://python-all.ru/3.8/library/exceptions.html#SystemExit), которому разрешено распространяться.5253Примечание о [`KeyboardInterrupt`](https://python-all.ru/3.8/library/exceptions.html#KeyboardInterrupt): это исключение может возникнуть в другом месте этого кода и может быть не всегда перехвачено. Вызывающий код должен быть готов обработать его.5455#### `InteractiveInterpreter.showsyntaxerror(filename=None)`5657Отображает только что возникшую синтаксическую ошибку. При этом не отображается стек вызовов, поскольку для синтаксических ошибок его нет. Если указан *filename*, он вставляется в исключение вместо имени файла по умолчанию, предоставленного синтаксическим анализатором Python, поскольку тот всегда использует `'<string>'` при чтении из строки. Вывод осуществляется методом [`write()`](https://python-all.ru/3.8/library/code.html#code.InteractiveInterpreter.write).5859#### `InteractiveInterpreter.showtraceback()`6061Отображает только что произошедшее исключение. Первый элемент стека удаляется, поскольку он находится в реализации объекта интерпретатора. Вывод записывается методом [`write()`](https://python-all.ru/3.8/library/code.html#code.InteractiveInterpreter.write).6263Изменено в версии 3.5: Вместо только основной трассировки отображается полная цепочка трассировки.6465#### `InteractiveInterpreter.write(data)`6667Записывает строку в поток стандартных ошибок (`sys.stderr`). Производные классы должны переопределить этот метод, чтобы обеспечить соответствующую обработку вывода по мере необходимости.6869## Объекты интерактивной консоли7071Класс [`InteractiveConsole`](https://python-all.ru/3.8/library/code.html#code.InteractiveConsole) является подклассом [`InteractiveInterpreter`](https://python-all.ru/3.8/library/code.html#code.InteractiveInterpreter) и, следовательно, предоставляет все методы объектов интерпретатора, а также следующие дополнения.7273#### `InteractiveConsole.interact(banner=None, exitmsg=None)`7475Точно эмулирует интерактивную консоль Python. Необязательный аргумент *banner* задает баннер, который выводится перед первым взаимодействием; по умолчанию выводится баннер, похожий на тот, что выводится стандартным интерпретатором Python, после которого в скобках указывается имя класса объекта консоли (чтобы не путать с настоящим интерпретатором – настолько он близок к нему!).7677Необязательный аргумент *exitmsg* задает сообщение о выходе, выводимое при завершении. Передайте пустую строку, чтобы подавить сообщение о выходе. Если *exitmsg* не указан или `None`, выводится сообщение по умолчанию.7879Изменено в версии 3.4: Чтобы не выводить никакой баннер, передайте пустую строку.8081Изменено в версии 3.6: Выводить сообщение о выходе при завершении.8283#### `InteractiveConsole.push(line)`8485Передает строку исходного текста интерпретатору. Строка не должна содержать завершающего перевода строки; в ней могут быть внутренние переводы строк. Строка добавляется в буфер, и метод `runsource()` интерпретатора вызывается с объединенным содержимым буфера в качестве исходного кода. Если это указывает на то, что команда выполнена или некорректна, буфер сбрасывается; в противном случае команда неполна, и буфер остается в том же состоянии, что и после добавления строки. Возвращаемое значение равно `True`, если требуется дополнительный ввод, `False`, если строка была обработана каким-либо образом (это то же самое, что `runsource()`).8687#### `InteractiveConsole.resetbuffer()`8889Удаляет любой необработанный исходный текст из входного буфера.9091#### `InteractiveConsole.raw_input(prompt="")`9293Выводит приглашение и считывает строку. Возвращаемая строка не включает завершающий символ новой строки. Если пользователь вводит последовательность клавиш EOF, возникает [`EOFError`](https://python-all.ru/3.8/library/exceptions.html#EOFError). Базовая реализация читает из `sys.stdin`; подкласс может заменить это на другую реализацию.94