codeop — Компиляция кода Python
Исходный код: Lib/codeop.py
Модуль codeop предоставляет инструменты, на основе которых можно эмулировать цикл «чтение-вычисление-вывод» Python, как это делается в модуле code. В результате, вам, вероятно, не нужно использовать модуль напрямую; если вы хотите включить такой цикл в свою программу, вы, скорее всего, должны использовать модуль code.
Эта задача состоит из двух частей:
- Определение, завершает ли строка ввода оператор Python: коротко, следует ли выводить «
>>>» или «...» дальше. - Запоминание ранее введённых будущих операторов, чтобы последующий ввод можно было компилировать с учётом этих операторов.
Модуль 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__, экземпляр «запоминает» и компилирует все последующие тексты программ с этим оператором.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/codeop.html