How to write verbose scripts

MRAB google at mrabarnett.plus.com
Tue Sep 2 22:53:27 CEST 2008


On Sep 2, 5:55 pm, Steven D'Aprano <st... at REMOVE-THIS-
cybersource.com.au> wrote:
> 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?
>
How about:

    def print_(obj, level=0):
        if _verbosity >= level:
            if callable(obj):
                obj = obj()
            print obj

so that you could then use:

    print_("precondition", level=2)

and:

    print_(calculate_complicated_thing, level=3)

or:

    print_(lambda: calculate_complicated_thing(argument), level=3)



More information about the Python-list mailing list