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