Spec-Zone.ru › Python 2.7

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

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

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

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

Модуль codeop предоставляет способ сделать каждое из этих действий, а также оба сразу.

Для выполнения только первого пункта:

codeop.compile_command(source[, filename[, symbol]])

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

Примечание о совместимости версий: Compile и CommandCompiler появились в Python 2.2. Если вы хотите включить возможности отслеживания будущих версий из 2.2, но сохранить совместимость с 2.1 и более ранними версиями Python, вы можете написать

try:
    from codeop import CommandCompiler
    compile_command = CommandCompiler()
    del CommandCompiler
except ImportError:
    from codeop import compile_command

что является незначительной модификацией, но вводит в вашу программу, возможно, нежелательное глобальное состояние, или вы можете написать:

try:
    from codeop import CommandCompiler
except ImportError:
    def CommandCompiler():
        from codeop import compile_command
        return compile_command

а затем вызвать CommandCompiler каждый раз, когда вам нужен новый объект компилятора.

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

Spec-Zone.ru

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