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 объекта кода будет 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.11/library/codeop.html