codeop — Компиляция кода Python
Исходный код: Lib/codeop.py
Модуль codeop предоставляет инструменты, на основе которых можно эмулировать цикл чтения-вычисления-печати Python, как это сделано в модуле 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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/codeop.html