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, которое по умолчанию равно
'<input>'
. ВозвращаетNone
, если source не является не допустимым кодом Python, но является префиксом допустимого кода Python.Если есть проблема с источником, будет вызвано исключение. <<<Если синтаксис Python неверен, то будет выдано
SyntaxError
, а если неверен литерал, тоOverflowError
илиValueError
.Аргумент символ определяет, будет ли source компилироваться как утверждение (
'single'
, по умолчанию), как последовательность утверждений ('exec'
) или как expression ('eval'
). Любое другое значение приведет к появлениюValueError
.Примечание
Возможно (но маловероятно), что синтаксический анализатор прекратит разбор с успешным результатом, не дойдя до конца источника; в этом случае символы в конце могут быть проигнорированы вместо того, чтобы вызвать ошибку. Например, за обратной косой чертой, за которой следуют две новые строки, может следовать произвольный мусор. Это будет исправлено, когда API для синтаксического анализатора будет улучшен.
-
class
codeop.
Compile
¶ Экземпляры этого класса имеют методы
__call__()
, идентичные по сигнатуре встроенной функцииcompile()
, но с той разницей, что если экземпляр компилирует текст программы, содержащий оператор__future__
, то он «запоминает» и компилирует все последующие тексты программ с действующим оператором.
-
class
codeop.
CommandCompiler
¶ Экземпляры этого класса имеют методы
__call__()
, идентичные по сигнатуре методамcompile_command()
; разница заключается в том, что если экземпляр компилирует текст программы, содержащий оператор__future__
, то он «запоминает» и компилирует все последующие тексты программ с действующим оператором.