Подтвердить что ты не робот

Эквивалент 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()

4b9b3361

Ответ 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 существует аналогичная оптимизация.

Так что не используйте внешний препроцессор - для этого у вас есть встроенный!