any macro-like construct/technique/trick?

Andrew Dalke dalke at dalkescientific.com
Wed Jun 1 23:03:50 EDT 2005


Mac wrote:
> Is there a way to mimic the behaviour of C/C++'s preprocessor for
> macros?

There are no standard or commonly accepted ways of doing that.

You could do as Jordan Rastrick suggested and write your own sort
of preprocessor, or use an existing one.  With the new import
hooks you can probably make the conversion happen automatically,
though I hesitate suggestions that as you might actually do that.
It's typically a bad idea because you're in essence creating a
new language that is similar to but not Python, making it harder
for people to understand what's going on.

>  The problem: a lot of code like this:
> 
> def foo():
>     # .... do some stuff
>     if debug:
>         emit_dbg_obj(DbgObjFoo(a,b,c))
  ...
> * the two-lines of debug conditional tend to really break up the flow
> of the surrounding code

If flow is your only concern you can have a do-nothing
function and at the top have

if debug:
  emit = emit_dbg_obj
else:
  def emit(*args, **kwargs): pass

then write all your code as

   emit(DbgObjFoo(a,b,c))

> * using
>    def debug_emit(obj):
>        if debug:
>            emit_dbg_obj(obj)
> is a poor solution, because it *always* instantiates DbgObj*, even when
> not needed; I want to avoid such unnecessary waste

That would work as well of course.

How bad is the waste?  Is it really a problem?

Is all your code of the form

  emit(Class(constructor, args))

?  If so, your debug_emit could be made to look like

  debug_emit(klass, *args, **kwargs):
    if debug:
      emit_dbg_obj(klass(*args, **kwargs))

and used

  debug_emit(DbgObjFoo, a, b, c)
  debug_emit(DbgObjBar, d, e)

though I would use the do-nothing function version I sketched
earlier because, *ahem*, it avoids an unnecessary waste of
the extra "if debug:" check.  :)

				Andrew
				dalke at dalkescientific.com




More information about the Python-list mailing list