codeop.md
1> **Источник:** https://python-all.ru/2.7/library/codeop.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 29.2. [`codeop`](https://python-all.ru/2.7/library/codeop.html#module-codeop) – Компиляция кода Python89Модуль [`codeop`](https://python-all.ru/2.7/library/codeop.html#module-codeop) предоставляет утилиты, с помощью которых можно эмулировать цикл чтения-вычисления-вывода Python, как это сделано в модуле [`code`](https://python-all.ru/2.7/library/code.html#module-code). Поэтому, вероятно, не стоит использовать этот модуль напрямую; если требуется включить такой цикл в программу, лучше использовать модуль [`code`](https://python-all.ru/2.7/library/code.html#module-code).1011Эта задача состоит из двух частей:12131. Возможность определить, завершает ли строка ввода оператор Python: проще говоря, решить, выводить ли далее ‘`>>>`’ или ‘`...`’.142. Запоминание того, какие future-инструкции ввёл пользователь, чтобы последующий ввод можно было компилировать с их учётом.1516Модуль [`codeop`](https://python-all.ru/2.7/library/codeop.html#module-codeop) предоставляет способ для выполнения каждого из этих действий, а также способ для выполнения обоих сразу.1718Чтобы выполнить только первое:1920#### `codeop.compile_command(source[, filename[, symbol]])`2122Пытается скомпилировать *исходный код*, который должен быть строкой кода Python, и возвращает объект кода, если *исходный код* является корректным кодом Python. В этом случае атрибут filename объекта кода будет равен *имя файла*, который по умолчанию равен `'<input>'`. Возвращает `None`, если *исходный код* *не* является корректным кодом Python, но является префиксом корректного кода Python.2324Если с *source* есть проблема, будет возбуждено исключение. [`SyntaxError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.SyntaxError) возбуждается при неверном синтаксисе Python, а [`OverflowError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.OverflowError) или [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError) – при неверном литерале.2526Аргумент *symbol* определяет, компилируется ли *source* как инструкция (`'single'`, по умолчанию) или как [выражение](https://python-all.ru/2.7/glossary.html#term-expression) (`'eval'`). Любое другое значение вызовет [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError).2728> **Примечание**29>30> Возможно (хотя маловероятно), что синтаксический анализатор прекратит разбор с успешным результатом до достижения конца исходного кода; в этом случае завершающие символы могут игнорироваться, а не вызывать ошибку. Например, обратная косая черта, за которой следуют две пустые строки, может сопровождаться произвольным мусором. Это будет исправлено, когда API анализатора станет лучше.3132#### `class codeop.Compile`3334Экземпляры этого класса имеют методы [`__call__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__call__), сигнатура которых идентична встроенной функции [`compile()`](https://python-all.ru/2.7/library/functions.html#compile), с той разницей, что если экземпляр компилирует текст программы, содержащий оператор [`__future__`](https://python-all.ru/2.7/library/__future__.html#module-__future__), экземпляр «запоминает» и компилирует все последующие тексты программ с учётом этого оператора.3536#### `class codeop.CommandCompiler`3738Экземпляры этого класса имеют методы [`__call__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__call__), сигнатура которых идентична [`compile_command()`](https://python-all.ru/2.7/library/codeop.html#codeop.compile_command); разница в том, что если экземпляр компилирует текст программы, содержащий оператор `__future__`, экземпляр «запоминает» и компилирует все последующие тексты программ с учётом этого оператора.3940Примечание о совместимости версий: [`Compile`](https://python-all.ru/2.7/library/codeop.html#codeop.Compile) и [`CommandCompiler`](https://python-all.ru/2.7/library/codeop.html#codeop.CommandCompiler) появились в Python 2.2. Если требуется включить функции отслеживания будущих изменений из 2.2, но при этом сохранить совместимость с Python 2.1 и более ранними версиями, можно либо написать4142```python43try:44 from codeop import CommandCompiler45 compile_command = CommandCompiler()46 del CommandCompiler47except ImportError:48 from codeop import compile_command49```5051что вносит небольшие изменения, но может добавить нежелательное глобальное состояние в программу, или можно написать:5253```python54try:55 from codeop import CommandCompiler56except ImportError:57 def CommandCompiler():58 from codeop import compile_command59 return compile_command60```6162и затем вызывать `CommandCompiler` каждый раз, когда требуется свежий объект компилятора.63