Документация 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')

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

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

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

Примечание

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

class codeop.Compile

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

class codeop.CommandCompiler

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