codeop
— Скомпилируйте код на Python¶
Исходный код: Lib/codeop.py
Модуль codeop
предоставляет утилиты, с помощью которых можно эмулировать цикл чтения-оценки-печати Python, как это делается в модуле code
. В результате вы, вероятно, не захотите использовать модуль напрямую; если вы хотите включить такой цикл в свою программу, вы, вероятно, захотите использовать модуль code
вместо этого.
Эта работа состоит из двух частей:
Возможность определить, завершает ли строка ввода инструкцию Python: короче говоря, указать, следует ли печатать «
>>>
» или «...
» далее.Запоминает, какие будущие инструкции ввел пользователь, чтобы последующие вводимые данные могли быть скомпилированы с учетом их действия.
Модуль codeop
предоставляет способ выполнения каждой из этих задач, а также способ выполнения их обеих.
Делать только первое:
- codeop.compile_command(source, filename='<input>', symbol='single')¶
Пытается скомпилировать source, который должен быть строкой кода на Python, и возвращает объект code, если source является допустимым кодом на Python. В этом случае атрибутом filename объекта code будет filename, который по умолчанию равен
'<input>'
. ВозвращаетNone
, если source не является допустимым кодом Python, но является префиксом допустимого кода Python.Если возникнет проблема с source, будет вызвано исключение.
SyntaxError
вызывается, если используется недопустимый синтаксис Python, иOverflowError
илиValueError
, если используется недопустимый литерал.Аргумент symbol определяет, будет ли source скомпилирован как инструкция (
'single'
, по умолчанию), как последовательность statement ('exec'
) или как expression ('eval'
). Любое другое значение приведет к увеличению значенияValueError
.Примечание
Возможно (но маловероятно), что синтаксический анализатор завершит синтаксический анализ с успешным результатом до того, как достигнет конца исходного кода; в этом случае конечные символы могут быть проигнорированы вместо того, чтобы вызывать ошибку. Например, обратная косая черта, за которой следуют две новые строки, может содержать произвольный мусор. Это будет исправлено, как только улучшится API для синтаксического анализатора.
- class codeop.Compile¶
Экземпляры этого класса имеют
__call__()
методы, идентичные по сигнатуре встроенной функцииcompile()
, но с той разницей, что если экземпляр компилирует текст программы, содержащий инструкцию__future__
, экземпляр «запоминает» и компилирует все последующие тексты программы с действующим заявлением.
- class codeop.CommandCompiler¶
Экземпляры этого класса имеют
__call__()
методы, идентичные по сигнатуреcompile_command()
; разница в том, что если экземпляр компилирует текст программы, содержащий инструкцию__future__
, экземпляр «запоминает» и компилирует все последующие тексты программы с этой инструкцией в силе.