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