Spec-Zone.ru › Python 3.11

codeop — Компиляция кода Python

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

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

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

  1. Возможность определить, завершает ли строка ввода оператор Python: короче говоря, определить, следует ли вывести ‘>>>’ или ‘...’ дальше.
  2. Запоминание ранее введённых пользователем будущих операторов, чтобы последующий ввод можно было компилировать с учётом этих операторов.

Модуль 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', по умолчанию), как последовательность операторов ('exec') или как выражение ('eval'). Любое другое значение вызовет ValueError.

Примечание

Возможный (но маловероятный) случай, когда анализатор прекращает анализ с успешным результатом до достижения конца источника; в этом случае заключительные символы могут быть проигнорированы вместо того, чтобы вызывать ошибку. Например, обратная косая черта, за которой следуют две строки новой строки, может быть после произвольного мусора. Эта проблема будет решена, как только API для анализатора станет лучше.

class codeop.Compile

Экземпляры этого класса имеют методы __call__(), идентичные по сигнатуре встроенной функции compile(), но с тем отличием, что если экземпляр компилирует текст программы, содержащий оператор __future__, экземпляр «запоминает» его и компилирует все последующие тексты программы с учётом этого оператора.

class codeop.CommandCompiler

Экземпляры этого класса имеют методы __call__(), идентичные по сигнатуре compile_command(); различие заключается в том, что если экземпляр компилирует текст программы, содержащий оператор __future__, экземпляр «запоминает» его и компилирует все последующие тексты программы с учётом этого оператора.

© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/codeop.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API