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', по умолчанию) или как выражение ('eval'). Любое другое значение вызовет поднятиеValueError.Примечание
Возможен (но маловероятен) случай, когда парсер завершает разбор с успехом до достижения конца исходного текста; в этом случае, символы, которые идут после этого, могут быть проигнорированы, вместо того, чтобы вызывать ошибку. Например, обратная косая черта, за которой следуют две новые строки, может быть за которой следуют произвольные данные. Это будет исправлено, когда API парсера станет лучше.
-
class codeop.Compile -
Экземпляры этого класса имеют методы
__call__(), идентичные по сигнатуре встроенной функцииcompile(), но с разницей, что если экземпляр компилирует текст программы, содержащий оператор__future__, экземпляр «запоминает» и компилирует все последующие тексты программы с учетом этого оператора.
-
class codeop.CommandCompiler -
Экземпляры этого класса имеют методы
__call__(), идентичные по сигнатуреcompile_command(); разница в том, что если экземпляр компилирует текст программы, содержащий оператор__future__, экземпляр «запоминает» и компилирует все последующие тексты программы с учетом этого оператора.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.6/library/codeop.html