Эквивалент Python для #ifdef DEBUG
В C мы пишем код типа
#ifdef DEBUG
printf("Some debug log... This could probably be achieved by python logging.Logger");
/* Do some sanity check code */
assert someCondition
/* More complex sanitycheck */
while(list->next){
assert fooCheck(list)
}
#endif
Есть ли способ сделать это в python?
Изменить: я получил свой ответ и многое другое:)
Паоло, Стивен Румбальски и Дж Себастьян дали мне информацию, которую я искал. Спасибо das за подробный ответ, хотя я, вероятно, не буду использовать препроцессор прямо сейчас.
J Себастьян, чей комментарий был удален, потому что ответ, в котором он опубликовал свой комментарий, удалил его ответ, я думаю.
Он сказал, что я могу использовать метод isEnabledFor() в Logger для подачи условного выражения.
Спасибо всем за ваши материалы. Это мой первый вопрос. Хотел бы я согласиться с ответами paolo или j sebastian. Но поскольку эти предложения были предложены в качестве комментариев, я согласен с ответом das.
Я, вероятно, буду использовать http://nestedinfiniteloops.wordpress.com/2012/01/15/if-debug-python-flavoured/ или Logger.isEnabledFor()
Ответы
Ответ 1
Что вы ищете, это препроцессор для python. Обычно у вас есть три варианта:
- Напишите selfmade script/program, которая заменяет части исходного кода на основе определенных шаблонов, прежде чем передавать результат интерпретатору (может быть сложно)
- Использовать препроцессор python специального назначения, например pppp - Pre-Process Python
- Используйте препроцессор общего назначения, например GPP
Я рекомендую сначала попробовать pppp;)
Основным преимуществом препроцессора по сравнению с установкой флага DEBUG
и текущего кода if (DEBUG == True)
является то, что условные проверки также стоят CPU циклов, поэтому лучше удалить код, который не нужно запускать (если python интерпретатор этого не делает), а не пропускает его.
Ответ 2
Используйте __debug__
в вашем коде:
if __debug__:
print 'Debug ON'
else:
print 'Debug OFF'
Создайте script abc.py
с указанным выше кодом, а затем
- Выполнить с
python -O abc.py
- Запуск с
python abc.py
Соблюдайте разницу.
Ответ 3
Ответ Мухаммеда - правильный подход: используйте if __debug__
.
На самом деле, Python полностью удаляет, if
выражение, если выражение является статическим постоянным (например, True
, False
, None
, __debug__
, 0
и 0.0
), что делает if __debug__
директиву на время компиляции, а не во время выполнения проверки:
>>> def test():
... if __debug__:
... return 'debug'
... return 'not debug'
...
>>> import dis
>>> dis.dis(test)
3 0 LOAD_CONST 1 ('debug')
2 RETURN_VALUE
Параметр -O
подробно объясняется в документации по python для параметров командной строки, и для операторов assert существует аналогичная оптимизация.
Так что не используйте внешний препроцессор - для этого у вас есть встроенный!
Ответ 4
Если вы ищете утверждения в Python, assert
является действительным действительным оператором python.
http://docs.python.org/2/reference/simple_stmts.html#assert