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

---

# 30.2. [`codeop`](https://python-all.ru/3.4/library/codeop.html#module-codeop) – Компиляция кода Python

Модуль [`codeop`](https://python-all.ru/3.4/library/codeop.html#module-codeop) предоставляет утилиты, с помощью которых можно эмулировать цикл чтения-вычисления-вывода Python, как это делается в модуле [`code`](https://python-all.ru/3.4/library/code.html#module-code). В результате использовать этот модуль напрямую, вероятно, не нужно; если требуется включить такой цикл в свою программу, лучше воспользоваться модулем [`code`](https://python-all.ru/3.4/library/code.html#module-code).

Эта задача состоит из двух частей:

1. Возможность определить, завершает ли строка ввода оператор Python: проще говоря, решить, выводить ли дальше ‘`>>>`‘ или ‘`...`‘.
2. Запоминание того, какие future-инструкции ввёл пользователь, чтобы последующий ввод можно было компилировать с их учётом.

Модуль [`codeop`](https://python-all.ru/3.4/library/codeop.html#module-codeop) предоставляет способ делать каждое из этих действий, а также способ делать их вместе.

Чтобы выполнить только первое:

#### `codeop.compile_command(source, filename="<input>", symbol="single")`

Пытается скомпилировать *source*, который должен быть строкой кода Python, и возвращает объект кода, если *source* является корректным кодом Python. В этом случае атрибут filename объекта кода будет равен *filename*, который по умолчанию равен `'<input>'`. Возвращает `None`, если *source* *не* является корректным кодом Python, но является префиксом корректного кода Python.

Если с *source* возникла проблема, будет возбуждено исключение. [`SyntaxError`](https://python-all.ru/3.4/library/exceptions.html#SyntaxError) возбуждается при неверном синтаксисе Python, а [`OverflowError`](https://python-all.ru/3.4/library/exceptions.html#OverflowError) или [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError) – при неверном литерале.

Аргумент *symbol* определяет, компилируется ли *source* как инструкция (`'single'`, по умолчанию) или как [*выражение*](https://python-all.ru/3.4/glossary.html#term-expression) (`'eval'`). Любое другое значение приведёт к возбуждению [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError).

> **Примечание**
>
> Возможно (хотя маловероятно), что синтаксический анализатор прекратит разбор с успешным результатом до достижения конца исходного кода; в этом случае завершающие символы могут игнорироваться, а не вызывать ошибку. Например, обратная косая черта, за которой следуют две пустые строки, может сопровождаться произвольным мусором. Это будет исправлено, когда API анализатора станет лучше.

#### `class codeop.Compile`

Экземпляры этого класса имеют методы [`__call__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__call__) с сигнатурой, идентичной встроенной функции [`compile()`](https://python-all.ru/3.4/library/functions.html#compile), но с тем отличием, что если экземпляр компилирует текст программы, содержащий инструкцию [`__future__`](https://python-all.ru/3.4/library/__future__.html#module-__future__), то он 'запоминает' и компилирует все последующие тексты программ с учётом этой инструкции.

#### `class codeop.CommandCompiler`

Экземпляры этого класса имеют методы [`__call__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__call__) с сигнатурой, идентичной [`compile_command()`](https://python-all.ru/3.4/library/codeop.html#codeop.compile_command); отличие в том, что если экземпляр компилирует текст программы, содержащий инструкцию `__future__`, то он 'запоминает' и компилирует все последующие тексты программ с учётом этой инструкции.
