codeop – Компиляция кода Python¶codeop – Compile Python code
Исходный код: Lib/codeop.py
Модуль codeop предоставляет утилиты, с помощью которых можно эмулировать цикл чтения-вычисления-вывода Python, как это сделано в модуле code. Поэтому, вероятно, не стоит использовать этот модуль напрямую; если требуется включить такой цикл в программу, лучше использовать модуль code.
Эта задача состоит из двух частей:
Возможность определить, завершает ли строка ввода оператор Python: проще говоря, решить, выводить ли далее ‘
>>>’ или ‘...’.Запоминание, какие 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', по умолчанию), как последовательность операторов ('exec') или как выражение ('eval'). Любое другое значение приведёт к возбуждениюValueError.Примечание
Возможно (хотя маловероятно), что синтаксический анализатор прекратит разбор с успешным результатом до достижения конца исходного кода; в этом случае завершающие символы могут игнорироваться, а не вызывать ошибку. Например, обратная косая черта, за которой следуют две пустые строки, может сопровождаться произвольным мусором. Это будет исправлено, когда API анализатора станет лучше.
- class codeop.Compile¶
Экземпляры этого класса имеют методы
__call__(), сигнатура которых идентична встроенной функцииcompile(), с той разницей, что если экземпляр компилирует текст программы, содержащий оператор__future__, экземпляр «запоминает» и компилирует все последующие тексты программ с учётом этого оператора.
- class codeop.CommandCompiler¶
Экземпляры этого класса имеют методы
__call__(), сигнатура которых идентичнаcompile_command(); разница в том, что если экземпляр компилирует текст программы, содержащий оператор__future__, экземпляр «запоминает» и компилирует все последующие тексты программ с учётом этого оператора.