> **Источник:** https://python-all.ru/3.0/library/code.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# `code` – Базовые классы интерпретатора

Модуль `code` предоставляет средства для реализации циклов «чтение-вычисление-вывод» (read-eval-print) в Python. В него входят два класса и вспомогательные функции, которые можно использовать для построения приложений, предоставляющих интерактивное приглашение интерпретатора.

#### `[code.InteractiveInterpreter]class code.InteractiveInterpreter([locals])`

Этот класс занимается разбором кода и состоянием интерпретатора (пространством имён пользователя); он не занимается буферизацией ввода, выводом приглашений или именованием входных файлов (имя файла всегда передаётся явно). Необязательный аргумент

*locals*

задаёт словарь, в котором будет выполняться код; по умолчанию он равен новому словарю с ключом

`'__name__'`

, установленным в

`'__console__'`

, и ключом

`'__doc__'`

, установленным в

`None`

.

#### `[code.InteractiveConsole]class code.InteractiveConsole([locals[, filename]])`

Тесно эмулирует поведение интерактивного интерпретатора Python. Этот класс строится на основе

[`InteractiveInterpreter`](https://python-all.ru/3.0/library/code.html#code.InteractiveInterpreter)

и добавляет приглашения с помощью знакомых

`sys.ps1`

и

`sys.ps2`

, а также буферизацию ввода.

#### `[code.interact]code.interact([banner[, readfunc[, local]]])`

Удобная функция для запуска цикла чтения-вычисления-вывода. Она создаёт новый экземпляр

[`InteractiveConsole`](https://python-all.ru/3.0/library/code.html#code.InteractiveConsole)

и, если указан

*readfunc*

, использует его в качестве метода

`raw_input()`

. Если указан

*local*

, он передаётся конструктору

[`InteractiveConsole`](https://python-all.ru/3.0/library/code.html#code.InteractiveConsole)

для использования в качестве пространства имён по умолчанию для цикла интерпретатора. Затем запускается метод

[`interact()`](https://python-all.ru/3.0/library/code.html#code.interact)

экземпляра, при этом

*banner*

передаётся в качестве баннера, если указан. Консольный объект после использования отбрасывается.

#### `[code.compile_command]code.compile_command(source[, filename[, symbol]])`

Эта функция полезна для программ, которые хотят имитировать главный цикл интерпретатора Python (также известный как цикл чтение-вычисление-печать). Сложность заключается в определении того, когда пользователь ввёл неполную команду, которую можно дополнить, введя ещё текст (в отличие от полной команды или синтаксической ошибки). Эта функция *почти* всегда принимает то же решение, что и настоящий главный цикл интерпретатора.

*source* – строка с исходным кодом; *filename* – необязательное имя файла, из которого был прочитан источник, по умолчанию `'<input>'`; а *symbol* – необязательный начальный символ грамматики, который должен быть либо `'single'` (по умолчанию), либо `'eval'`.

Возвращает объект кода (то же, что и `compile(source, filename, symbol)`), если команда полная и корректная; `None` – если команда неполная; возбуждает [`SyntaxError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.SyntaxError), если команда полная и содержит синтаксическую ошибку, или возбуждает [`OverflowError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.OverflowError) или [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError), если команда содержит недопустимый литерал.

## Объекты интерактивного интерпретатора

#### `[code.InteractiveInterpreter.runsource]InteractiveInterpreter.runsource(source[, filename[, symbol]])`

Компилирует и выполняет некоторый исходный код в интерпретаторе. Аргументы те же, что и для [`compile_command()`](https://python-all.ru/3.0/library/code.html#code.compile_command); по умолчанию для *filename* используется `'<input>'`, а для *symbol* – `'single'`. Может произойти одно из нескольких событий:

- Входные данные некорректны; [`compile_command()`](https://python-all.ru/3.0/library/code.html#code.compile_command) возбудил исключение ([`SyntaxError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.SyntaxError) или [`OverflowError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.OverflowError)). При вызове метода [`showsyntaxerror()`](https://python-all.ru/3.0/library/code.html#code.InteractiveInterpreter.showsyntaxerror) будет напечатана трассировка синтаксической ошибки. [`runsource()`](https://python-all.ru/3.0/library/code.html#code.InteractiveInterpreter.runsource) возвращает `False`.
- Входные данные неполны, и требуется дополнительный ввод; [`compile_command()`](https://python-all.ru/3.0/library/code.html#code.compile_command) вернула `None`. [`runsource()`](https://python-all.ru/3.0/library/code.html#code.InteractiveInterpreter.runsource) возвращает `True`.
- Входные данные полны; [`compile_command()`](https://python-all.ru/3.0/library/code.html#code.compile_command) вернула объект кода. Код выполняется вызовом [`runcode()`](https://python-all.ru/3.0/library/code.html#code.InteractiveInterpreter.runcode) (который также обрабатывает исключения времени выполнения, за исключением [`SystemExit`](https://python-all.ru/3.0/library/exceptions.html#exceptions.SystemExit)). [`runsource()`](https://python-all.ru/3.0/library/code.html#code.InteractiveInterpreter.runsource) возвращает `False`.

Возвращаемое значение можно использовать для выбора между `sys.ps1` и `sys.ps2` при выводе приглашения для следующей строки.

#### `[code.InteractiveInterpreter.runcode]InteractiveInterpreter.runcode(code)`

Выполняет объект кода. При возникновении исключения вызывается [`showtraceback()`](https://python-all.ru/3.0/library/code.html#code.InteractiveInterpreter.showtraceback) для отображения трассировки. Перехватываются все исключения, кроме [`SystemExit`](https://python-all.ru/3.0/library/exceptions.html#exceptions.SystemExit), которому разрешено распространяться.

Примечание о [`KeyboardInterrupt`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyboardInterrupt): это исключение может возникнуть в других местах этого кода и не всегда перехватывается. Вызывающая сторона должна быть готова к его обработке.

#### `[code.InteractiveInterpreter.showsyntaxerror]InteractiveInterpreter.showsyntaxerror([filename])`

Отображает только что возникшую синтаксическую ошибку. Трассировка стека не отображается, так как для синтаксических ошибок её нет. Если передан

*filename*

, он вставляется в исключение вместо имени файла по умолчанию, которое предоставляет парсер Python (поскольку при чтении из строки он всегда использует

`'<string>'`

). Вывод осуществляется методом

[`write()`](https://python-all.ru/3.0/library/code.html#code.InteractiveInterpreter.write)

.

#### `[code.InteractiveInterpreter.showtraceback]InteractiveInterpreter.showtraceback()`

Отображает только что возникшее исключение. Первый элемент стека удаляется, так как он относится к реализации объекта интерпретатора. Вывод осуществляется методом

[`write()`](https://python-all.ru/3.0/library/code.html#code.InteractiveInterpreter.write)

.

#### `[code.InteractiveInterpreter.write]InteractiveInterpreter.write(data)`

Записывает строку в поток стандартной ошибки (

`sys.stderr`

). Производные классы должны переопределять этот метод, чтобы обеспечить соответствующую обработку вывода по мере необходимости.

## Объекты интерактивной консоли

Класс [`InteractiveConsole`](https://python-all.ru/3.0/library/code.html#code.InteractiveConsole) является подклассом [`InteractiveInterpreter`](https://python-all.ru/3.0/library/code.html#code.InteractiveInterpreter), поэтому он предоставляет все методы объектов интерпретатора, а также следующие дополнения.

#### `[code.InteractiveConsole.interact]InteractiveConsole.interact([banner])`

Точно эмулирует интерактивную консоль Python. Необязательный аргумент banner задаёт приветствие, которое выводится перед первым взаимодействием; по умолчанию выводится приветствие, сходное с тем, что печатает стандартный интерпретатор Python, после чего в скобках указывается имя класса объекта консоли (чтобы не путать его с настоящим интерпретатором – настолько он близок!).

#### `[code.InteractiveConsole.push]InteractiveConsole.push(line)`

Передаёт строку исходного текста интерпретатору. Строка не должна содержать завершающий символ новой строки; она может содержать внутренние символы новой строки. Строка добавляется в буфер, и вызывается метод интерпретатора

`runsource()`

с объединённым содержимым буфера в качестве исходного кода. Если это указывает, что команда была выполнена или недействительна, буфер сбрасывается; в противном случае команда неполная, и буфер остаётся в том виде, в каком он был после добавления строки. Возвращаемое значение равно

`True`

, если требуется дополнительный ввод, и

`False`

, если строка была обработана каким-либо образом (это то же самое, что и

`runsource()`

).

#### `[code.InteractiveConsole.resetbuffer]InteractiveConsole.resetbuffer()`

Удаляет любой необработанный исходный текст из входного буфера.

#### `[code.InteractiveConsole.raw_input]InteractiveConsole.raw_input([prompt])`

Выводит приглашение и читает строку. Возвращённая строка не включает завершающий символ новой строки. Если пользователь вводит последовательность клавиш EOF, возбуждается исключение

[`EOFError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.EOFError)

. Базовая реализация читает из

`sys.stdin`

; подкласс может заменить её другой реализацией.
