Условная компиляция в 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"
Ответ 6
Вы можете использовать описанный здесь метод: Определить, определена ли переменная в Python в качестве замены #ifdef