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.

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

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

Примечание

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

class codeop.Compile

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

class codeop.CommandCompiler

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

Вернуться на верх