codeop – Компиляция кода Python¶codeop – Compile Python code
Исходный код: Lib/codeop.py
Модуль codeop предоставляет утилиты, с помощью которых можно эмулировать цикл чтения-вычисления-вывода Python, как это сделано в модуле code. Поэтому, вероятно, не стоит использовать этот модуль напрямую; если требуется включить такой цикл в программу, лучше использовать модуль code.
Эта задача состоит из двух частей:
Возможность определить, завершает ли строка ввода оператор Python: проще говоря, решить, выводить ли далее ‘
>>>’ или ‘...’.Запоминание того, какие future-инструкции ввёл пользователь, чтобы последующий ввод можно было компилировать с их учётом.
Модуль codeop предоставляет способ для выполнения каждого из этих действий, а также способ для выполнения обоих сразу.
Чтобы выполнить только первое:
-
codeop.compile_command(source, filename="<input>", symbol="single")¶ Пытается скомпилировать исходный код, который должен быть строкой кода Python, и возвращает объект кода, если исходный код является корректным кодом Python. В этом случае атрибут filename объекта кода будет равен имя файла, который по умолчанию равен
'<input>'. ВозвращаетNone, если исходный код не является корректным кодом Python, но является префиксом корректного кода Python.Если с source есть проблема, будет возбуждено исключение.
SyntaxErrorвозбуждается при неверном синтаксисе Python, аOverflowErrorилиValueError– при неверном литерале.Аргумент символ определяет, компилируется ли исходный код как инструкция (
'single', по умолчанию), как последовательность инструкций ('exec') или как выражение ('eval'). Любое другое значение приведёт к возникновениюValueError.Примечание
Возможно (хотя маловероятно), что синтаксический анализатор прекратит разбор с успешным результатом до достижения конца исходного кода; в этом случае завершающие символы могут игнорироваться, а не вызывать ошибку. Например, обратная косая черта, за которой следуют две пустые строки, может сопровождаться произвольным мусором. Это будет исправлено, когда API анализатора станет лучше.
-
class
codeop.Compile¶ Экземпляры этого класса имеют методы
__call__(), сигнатура которых идентична встроенной функцииcompile(), с той разницей, что если экземпляр компилирует текст программы, содержащий оператор__future__, экземпляр «запоминает» и компилирует все последующие тексты программ с учётом этого оператора.
-
class
codeop.CommandCompiler¶ Экземпляры этого класса имеют методы
__call__(), сигнатура которых идентичнаcompile_command(); разница в том, что если экземпляр компилирует текст программы, содержащий оператор__future__, экземпляр «запоминает» и компилирует все последующие тексты программ с учётом этого оператора.