codeop — Компиляция Python кода


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

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

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

Модуль 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__, экземпляр «помнит» и компилируют все последующие программные тексты с вступившим в силу оператором.