How to write verbose scripts

Diez B. Roggisch deets at nospam.web.de
Tue Sep 2 15:06:58 EDT 2008


Steven D'Aprano schrieb:
> I find myself writing command line tools in Python where I wish to 
> include "verbose" output to stdout.
> 
> I start with a helper function:
> 
> 
> def print_(obj, level=0):
>     if _verbosity >= level:
>         print obj
> 
> 
> And then I end up with functions or methods looking like this:
> 
> 
> def parrot(x)
>     print_("precondition", level=2)
>     do_something()
>     print_("status is good...", level=1)
>     print_("parrot is squawking strongly now", level=2)
>     do_something_else()
>     print_("squawk squawk squawk", level=3)
>     do_more()
>     print_("postcondition", level=1)
>     return something
> 
> 
> That often means that my functions end up with more message printing code 
> than actual code. The whole thing seems messy and hard to manage for all 
> but the smallest scripts.
> 
> Worst of all, sometimes the messages I wish to print may be expensive to 
> compute, and I don't want to waste time computing them if they aren't 
> going to be printed because the verbosity is too low. But nor do I wish 
> to fill my code with this:
> 
> if _verbosity >= 3:
>     x = calculate_complicated_thing()
>     print_(x, level=3)
> 
> 
> 
> Is there a better way of doing this than the way I am going about it?

I use the logging-module.

Regarding the expensive computations: maysomething like this help:

class DeferredToString(object):

     def __init__(self, func):
         self.func = func

     def __repr__(self):
         return repr(self.func())

     def __str__(self):
         return str(self.func())



dts = DeferredToString

Because then you can do

logger.debug("Some text for an: %r", dts(lambda: long_computation()))

Because AFAIK the string is only interpolated if the logging level is 
actually put out.

Diez



More information about the Python-list mailing list