Условная компиляция в Python

Как сделать условную компиляцию в Python?

Используется ли DEF?

Ответы

Ответ 1

Python не скомпилирован в том же смысле, что и C или С++ или даже Java, файлы python скомпилированы "на лету", вы можете думать о нем как о подобном интерпретируемому языку, например Basic или Perl. 1суб >

Вы можете сделать что-то эквивалентное условной компиляции, просто используя оператор if. Например:

if FLAG:
    def f():
        print "Flag is set"
else:
    def f():
        print "Flag is not set"

Вы можете сделать то же самое для классов создания, установки переменных и почти всего.

Ближайшим способом имитации IFDEF будет использование функции hasattr. Например:.

if hasattr(aModule, 'FLAG'):
    # do stuff if FLAG is defined in the current module.

Вы также можете использовать предложение try/except, чтобы уловить ошибки имен, но идиоматическим способом было бы установить переменную None в верхней части вашего script.

  • Код Python является байтом, скомпилированным в промежуточную форму, например Java, однако, как правило, не существует отдельного этапа компиляции. Исходные исходные файлы, которые заканчиваются на .py, являются исполняемыми.

Ответ 2

На самом деле есть способ получить условную компиляцию, но она очень ограничена.

if __debug__:
    doSomething()

Флаг __debug__ - особый случай. При вызове python с параметрами -O или -OO __debug__ будет ложным, а компилятор будет игнорировать этот оператор. Это используется в основном с утверждениями, поэтому утверждения исчезают, если вы действительно компилируете свои сценарии с оптимизацией.

Итак, если ваша цель - добавить код отладки, но предотвратить ее замедление или иное влияние на сборку "release", это делает то, что вы хотите. Но вы не можете присвоить значение __debug__, так что обо всем, что вы можете использовать для него.

Ответ 3

Используйте pypreprocessor

который также можно найти на PYPI (индекс пакета Python) и может быть выбран с помощью pip.

Основной пример использования:

from pypreprocessor import pypreprocessor

pypreprocessor.parse()

#define debug

#ifdef debug
print('The source is in debug mode')
#else
print('The source is not in debug mode')
#endif

Вы также можете вывести постобрабоченный код в файл, указав...

pypreprocessor.output = 'output_file_name.py'

где-нибудь между импортом pypreprocessor и вызовом parse().

Модуль - это, по сути, реализация python условной компиляции препроцессора C.

SideNote: это совместимо с python2x и python 3k

Отказ от ответственности: я являюсь автором pypreprocessor

Update:

Я забыл упомянуть об этом раньше. В отличие от подходов if/else или if _debug:, описанных в других ответах, это истинный препроцессор. Выпущенный байт-код не будет содержать код, который условно исключен.

Ответ 4

Python автоматически компилирует модуль при его импорте, поэтому единственный способ избежать его компиляции - не импортировать его. Вы можете написать что-то вроде:

if some_condition:
  import some_module

Но это будет работать только для полных модулей. В C и С++ обычно используется препроцессор для условной компиляции. Нет ничего, что помешало бы вам использовать препроцессор в вашем коде Python, чтобы вы могли написать что-то вроде:

#ifdef SOME_CONDITION
def some_function():
  pass
#endif

Запустите это через препроцессор C, и у вас будет реальная условная компиляция, а some_function будет определена только в том случае, если определена SOME_CONDITION.

НО (и это важно): Условная компиляция, вероятно, не то, что вы хотите. Помните, что при импорте модуля Python просто выполняет в нем код. Операторы def и class в модуле фактически выполняются при импорте модуля. Таким образом, типичный способ реализации того, что другие языки используют для условной компиляции, - это просто нормальный оператор if, например:

if some_condition:
  def some_function():
    pass

Это будет определять только some_function, если SOME_CONDITION истинно.

Это похоже на то, что делает динамические языки настолько мощными, оставаясь концептуально простыми.

Ответ 5

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

if happy:
    def makemehappy():
        return "I'm good"