[BangPypers] How to create Debug and Release code in Python

Vishal vsapre80 at gmail.com
Tue Jun 16 21:59:30 CEST 2009


Cool....While I was using preprocessor directives in C/C++...the usual
internet rant I've always heard, is "preprocessor is bad, using preprocessor
is bad habit.". Somehow I feel that preprocessing is not all that bad. It
can and does solve important problems. May be these rants mostly referred to
the 'macro' side of things...

Thanks a lot Jeff, this was really informative.

Vishal

On Tue, Jun 16, 2009 at 11:57 AM, Jeff Rush <jeff at taupro.com> wrote:

> Vishal wrote:
> >
> > *Is there a way to create a conditionally compilable Python script
> > ?* Some facility that would prevent from code getting compiled into
> > ".pyc"....something like the old #ifdef #endif preprocessor
> > directives....is there a Python preprocessory available :)
>
> I've given this more thought.  In the April 2009 issue of Python
> Magazine is a wonderful article by Paul McGuire on writing Domain
> Specific Languages.  It shows how to intercept the import of specific
> types of files to preprocess the source before compiling it into
> bytecode.  I played with those ideas to see what could be done for your
> case.
>
> So say you had a module marked up with special commenting like:
>
> --- cut here --- abc.pyp
> def main():
>    print "Hello"  #? DEBUG
>    print "There"  #? DEBUG2
>    print "World"
> --- cut here --- abc.pyp
>
> Then in your main module you could do the following:
>
> --- cut here --- demo.py
> import cond_importer # can put in site.py for global application
>
> import abc
> abc.main()
> --- cut here --- demo.py
>
> Now you run the program normally and get:
>
> $ python2.5 demo.py
> Hello
> There
> World
>
> or you can filter out lines using:
>
> $ EXCLUDES=DEBUG python2.5 demo.py
> There
> World
>
> or even:
>
> $ EXCLUDES=DEBUG:DEBUG2 python2.5 demo.py
> World
>
> The magic to make this happen is just:
>
> --- cut here --- cond_import.py
> from __future__ import with_statement # for Python < 2.6
>
> import os
> import imputil
> import re
>
> patt = re.compile(r".*#\? (?P<tag>[_a-zA-Z][_a-zA-Z0-9]*)$")
>
> try: # construct a set of tags to exclude in .py source
>    pyexcludes = frozenset(os.environ['EXCLUDES'].split(':'))
> except Exception:
>    pyexcludes = frozenset()
>
> def preprocess_source(filepath, fileinfo, filename):
>
>    src = []
>    with file(filepath, 'r') as f:
>        for line in f:
>            m = patt.match(line)
>            if m is None or m.group('tag') not in pyexcludes:
>                src.append(line)
>
>        src = '\n'.join(src)
>        codeobj = compile(src, filepath, 'exec')
>
>    # create return tuple:
>    #   import flag (0=module, 1=package)
>    #   code object
>    #   dictionary of variable definitions
>    return 0, codeobj, {}
>
> importer = imputil.ImportManager()
> importer.add_suffix('.pyp', preprocess_source)
> importer.install()
> --- cut here --- cond_import.py
>
> I arbitrarily chose a file extension of .pyp for files to preprocess but
>  you could use anything.  And the tags to exclude could instead be tags
> to include.  For handling packages (dirs) instead of modules you'd have
> to add a test for file or directory and change the code a bit.
>
> Anyway it raises some interesting possibilities of preprocessing.
> Python is just so cool.
>
> -Jeff
> _______________________________________________
> BangPypers mailing list
> BangPypers at python.org
> http://mail.python.org/mailman/listinfo/bangpypers
>



-- 
Thanks and best regards,
Vishal Sapre

---

"So say...Day by day, in every way, I am getting better, better and better
!!!"
"A Strong and Positive attitude creates more miracles than anything else.
Because...Life is 10% how you make it, and 90% how you take it"
"Diamond is another piece of coal that did well under pressure”
"Happiness keeps u Sweet, Trials keep u Strong,
Sorrow keeps u Human, Failure Keeps u Humble,
Success keeps u Glowing, But only God Keeps u Going.....Keep Going....."
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/bangpypers/attachments/20090617/36a11649/attachment.htm>


More information about the BangPypers mailing list