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

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

Модуль 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', по умолчанию) или как выражение ('eval'). Любое другое значение приведёт к возбуждению ValueError.

Примечание

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

class codeop.Compile

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

class codeop.CommandCompiler

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