Python equivalent for #ifdef DEBUG

PythonDebugging

Python Problem Overview


In C we write code like

#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

Is there a way to do this in python?

Edit: I got my answer, and more :) Paolo, Steven Rumbalski and J Sebastian gave me the information I was looking for. Thanks das for the detailed answer, although I'll probably not use a preprocessor right now.

J Sebastian, whose comment got deleted because the answer in which he posted his comment, deleted his answer I think. He said I could use the isEnabledFor() method in Logger to feed a conditional.

Thanks everyone for your inputs. This is my first question. I wish I could accept paolo, or j sebastian's answers. But since those were offered as comments, I'll accept das' answer.

I will probably use either http://nestedinfiniteloops.wordpress.com/2012/01/15/if-debug-python-flavoured/ or Logger.isEnabledFor()

Python Solutions


Solution 1 - Python

Use __debug__ in your code:

if __debug__:
    print 'Debug ON'
else:
    print 'Debug OFF'
    

Create a script abc.py with the above code and then

  1. Run with python -O abc.py
  2. Run with python abc.py

Observe the difference.

Solution 2 - Python

Mohammad's answer is the right approach: use if __debug__.

In fact, Python completely removes the if statement if the expression is a static constant (such as True, False, None, __debug__, 0, and 0.0), making if __debug__ a compile-time directive rather than a runtime check:

>>> def test():
...     if __debug__:
...         return 'debug'
...     return 'not debug'
...
>>> import dis
>>> dis.dis(test)
  3           0 LOAD_CONST               1 ('debug')
              2 RETURN_VALUE

The -O option is explained in detail in the python documentation for command line options, and there is similar optimization for assert statements.

So don't use an external preprocessor—for this purpose, you have one built in!

Solution 3 - Python

What you are looking for is a preprocessor for python. Generally you have three options:

  1. Write a selfmade script/program which replaces parts of your sourcecode based on certain templates before passing the result on to the interpreter (May be difficult)
  2. Use a special purpose python preprocessor like pppp - Poor's Python Pre-Processor
  3. Use a general purpose preprocessor like GPP

I recommend trying pppp first ;)

The main advantage of a preprocessor compared to setting a DEBUG flag and running code if (DEBUG == True) is that conditional checks also cost CPU cycles, so it is better to remove code that does not need to be run (if the python interpreter doesn't do that anyway), instead of skipping it.

Solution 4 - Python

If you are looking for assertions in Python, assert is an actual valid python statement. http://docs.python.org/2/reference/simple_stmts.html#assert

Solution 5 - Python

check the result of sys.gettrace() is None. That will mean that there is no debugger

import sys
if sys.gettrace():
    print("debug mode!")
else:
   print("debug mode is off!")

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSpundunView Question on Stackoverflow
Solution 1 - PythonMohammad Shahid SiddiquiView Answer on Stackoverflow
Solution 2 - PythondoctaphredView Answer on Stackoverflow
Solution 3 - Pythondas_weezulView Answer on Stackoverflow
Solution 4 - PythonJulien VivenotView Answer on Stackoverflow
Solution 5 - Pythonmajid lesaniView Answer on Stackoverflow