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

Источник: Lib/codeop.py


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

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

  1. Возможность определить, завершает ли строка ввода оператор Python: короче говоря, определить, что печатать дальше - „>>>“ или „...“.

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

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

Чтобы сделать именно первое:

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

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

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

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

Примечание

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

class codeop.Compile

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

class codeop.CommandCompiler

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