29.2. codeop – Компиляция кода Python¶codeop – Compile Python code
Модуль codeop предоставляет утилиты, с помощью которых можно эмулировать цикл чтения-вычисления-вывода Python, как это сделано в модуле code. Поэтому, вероятно, не стоит использовать этот модуль напрямую; если требуется включить такой цикл в программу, лучше использовать модуль code.
Эта задача состоит из двух частей:
Возможность определить, завершает ли строка ввода оператор Python: проще говоря, решить, выводить ли далее ‘
>>>’ или ‘...’.Запоминание того, какие future-инструкции ввёл пользователь, чтобы последующий ввод можно было компилировать с их учётом.
Модуль codeop предоставляет способ для выполнения каждого из этих действий, а также способ для выполнения обоих сразу.
Чтобы выполнить только первое:
-
codeop.compile_command(source[, filename[, symbol]])¶ Пытается скомпилировать исходный код, который должен быть строкой кода Python, и возвращает объект кода, если исходный код является корректным кодом Python. В этом случае атрибут filename объекта кода будет равен имя файла, который по умолчанию равен
'<input>'. ВозвращаетNone, если исходный код не является корректным кодом 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__, экземпляр «запоминает» и компилирует все последующие тексты программ с учётом этого оператора.
Примечание о совместимости версий: Compile и
CommandCompiler появились в Python 2.2. Если требуется включить функции отслеживания будущих изменений из 2.2, но при этом сохранить совместимость с Python 2.1 и более ранними версиями, можно либо написать
try:
from codeop import CommandCompiler
compile_command = CommandCompiler()
del CommandCompiler
except ImportError:
from codeop import compile_command
что вносит небольшие изменения, но может добавить нежелательное глобальное состояние в программу, или можно написать:
try:
from codeop import CommandCompiler
except ImportError:
def CommandCompiler():
from codeop import compile_command
return compile_command
и затем вызывать CommandCompiler каждый раз, когда требуется свежий объект компилятора.