codeop — Скомпилируйте код на Python

Исходный код: Lib/codeop.py


Модуль codeop предоставляет утилиты, с помощью которых можно эмулировать цикл чтения-оценки-печати Python, как это делается в модуле code. В результате вы, вероятно, не захотите использовать модуль напрямую; если вы хотите включить такой цикл в свою программу, вы, вероятно, захотите использовать модуль code вместо этого.

Эта работа состоит из двух частей:

  1. Возможность определить, завершает ли строка ввода инструкцию Python: короче говоря, указать, следует ли печатать «>>>» или «...» далее.

  2. Запоминает, какие будущие инструкции ввел пользователь, чтобы последующие вводимые данные могли быть скомпилированы с учетом их действия.

Модуль 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__, экземпляр «запоминает» и компилирует все последующие тексты программы с этой инструкцией в силе.

Вернуться на верх