Документация Python неофициальный перевод

codeop – Компиляция кода Pythoncodeop – Compile Python code

Исходный код: Lib/codeop.py


Модуль codeop предоставляет утилиты, с помощью которых можно эмулировать цикл чтения-вычисления-вывода Python, как это сделано в модуле code. Поэтому, вероятно, не стоит использовать этот модуль напрямую; если требуется включить такой цикл в программу, лучше использовать модуль code.

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

  1. Возможность определить, завершает ли строка ввода оператор Python: проще говоря, решить, выводить ли далее ‘>>>’ или ‘...’.

  2. Запоминание того, какие future-инструкции ввёл пользователь, чтобы последующий ввод можно было компилировать с их учётом.

Модуль codeop предоставляет способ для выполнения каждого из этих действий, а также способ для выполнения обоих сразу.

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

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

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

Если с source есть проблема, будет возбуждено исключение. SyntaxError возбуждается при неверном синтаксисе Python, а OverflowError или ValueError – при неверном литерале.

Аргумент символ определяет, компилируется ли исходный код как инструкция ('single', по умолчанию), как последовательность инструкций ('exec') или как выражение ('eval'). Любое другое значение приведёт к возникновению ValueError.

Примечание

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

class codeop.Compile

Экземпляры этого класса имеют методы __call__(), сигнатура которых идентична встроенной функции compile(), с той разницей, что если экземпляр компилирует текст программы, содержащий оператор __future__, экземпляр «запоминает» и компилирует все последующие тексты программ с учётом этого оператора.

class codeop.CommandCompiler

Экземпляры этого класса имеют методы __call__(), сигнатура которых идентична compile_command(); разница в том, что если экземпляр компилирует текст программы, содержащий оператор __future__, экземпляр «запоминает» и компилирует все последующие тексты программ с учётом этого оператора.