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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/codeop.html