codeop — Компиляция кода Python
Исходный код: Lib/codeop.py
Модуль codeop предоставляет утилиты, на основе которых можно эмулировать цикл Python read-eval-print, как это делается в модуле code. В результате, вам, скорее всего, не нужно использовать этот модуль напрямую; если вы хотите включить такой цикл в свою программу, лучше использовать модуль code.
Эта задача состоит из двух частей:
- Определение, завершает ли строка ввода оператор Python: короче говоря, нужно ли выводить «
>>>» или «...» дальше. - Запоминание, какие будущие операторы ввёл пользователь, чтобы последующий ввод можно было компилировать с учётом этих операторов.
Модуль codeop предоставляет способ решения каждой из этих задач и обеих сразу.
Для решения только первой задачи:
-
codeop.compile_command(source, filename="<input>", symbol="single") -
Пытается скомпилировать source, которое должно быть строкой Python-кода, и возвращает объект кода, если source является корректным Python-кодом. В этом случае атрибут имени файла объекта кода будет 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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/codeop.html