28.2. codeop – Компиляция кода Python¶codeop – Compile Python code
Модуль codeop предоставляет утилиты, на основе которых можно эмулировать цикл чтения, вычисления и вывода Python, как это делается в модуле code. Поэтому данный модуль, скорее всего, не требуется использовать напрямую; если необходимо включить такой цикл в программу, вероятно, стоит использовать модуль code.
Эта задача состоит из двух частей:
- Возможность определить, завершает ли строка ввода оператор Python: проще говоря, решить, выводить ли дальше ‘>>>‘ или ‘...‘.
- Запоминание того, какие future-инструкции ввёл пользователь, чтобы последующий ввод можно было компилировать с их учётом.
Модуль 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__, то он 'запоминает' и компилирует все последующие тексты программ с учётом этой инструкции.