Google
 
Webnews.only-4-geeks.com
Interesting places
news.only-4-geeks.com Forum Index » PythonGoto page 1, 2  Next

How to write verbose scripts

 
Jump to:  
 
Steven D'Aprano
PostPosted: Tue Sep 02, 2008 2:55 pm    Post subject: How to write verbose scripts
       
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?



--
Steven
 

 
Joe Riopel
PostPosted: Tue Sep 02, 2008 3:07 pm    Post subject: Re: How to write verbose scripts
       
On Tue, Sep 2, 2008 at 12:55 PM, Steven D'Aprano
<steve@remove-this-cybersource.com.au> wrote:
Quote:
Is there a better way of doing this than the way I am going about it?

Would the logging module help, and just print the output to the stdout
(or a file) instead?
 

 
Diez B. Roggisch
PostPosted: Tue Sep 02, 2008 5:06 pm    Post subject: Re: How to write verbose scripts
       
Steven D'Aprano schrieb:
Quote:
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
 

 
Mensanator
PostPosted: Tue Sep 02, 2008 5:52 pm    Post subject: Re: How to write verbose scripts
       
On Sep 2, 11:55 am, Steven D'Aprano <st...@REMOVE-THIS-
cybersource.com.au> wrote:
Quote:
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 do something like this, although I don't know if it would
be an improvement.

def collatz(a,p):
""" 3x+1 sequencer, no loop detection

collatz(a,p)
a: starting value
p: print options (binary)
bit 0 print even numbers (turns off power division)
bit 1 print odd numbers
bit 2 print debug (if any)
returns: CollatzSequenceParameters [R1count, R2count]
"""
ONE = gmpy.mpz(1)
TWO = gmpy.mpz(2)
TWE = gmpy.mpz(3)
a = gmpy.mpz(a)
t = 0
u = 0
done = 0

if (p & 1)==1:
print_evens = True
else:
print_evens = False
if (p & 2)==2:
print_odds = True
else:
print_odds = False
if (p & 4)==4:
print_debug = True
else:
print_debug = False

while done==0:
f = gmpy.scan1(a,0) # locate LS 1-bit
if f>0: # it's even
if print_evens:
print a,
a = a >> 1 # no power division
u += 1
else:
a = a >> f # power division
u += f
else:
if print_odds:
print a,
if a==1:
done = 1
seq_end = t + u
else:
a = a*TWE + ONE
t += 1
return [u,t]



Quote:

--
Steven
 

 
MRAB
PostPosted: Tue Sep 02, 2008 8:53 pm    Post subject: Re: How to write verbose scripts
       
On Sep 2, 5:55 pm, Steven D'Aprano <st...@REMOVE-THIS-
cybersource.com.au> wrote:
Quote:
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)
 

 
John Machin
PostPosted: Tue Sep 02, 2008 9:14 pm    Post subject: Re: How to write verbose scripts
       
On Sep 3, 3:52 am, Mensanator <mensana...@aol.com> wrote:
Quote:
On Sep 2, 11:55 am, Steven D'Aprano <st...@REMOVE-THIS-

if (p & 1)==1:
print_evens = True
else:
print_evens = False
if (p & 2)==2:
print_odds = True
else:
print_odds = False
if (p & 4)==4:
print_debug = True
else:
print_debug = False

No, no, no, you've taken "How to write verbose scripts" rather too
literally; try this:

print_evens = p & 1
print_odds = p & 2
print_debug = p & 4
 

 
Mensanator
PostPosted: Tue Sep 02, 2008 10:07 pm    Post subject: Re: How to write verbose scripts
       
On Sep 2, 4:14 pm, John Machin <sjmac...@lexicon.net> wrote:
Quote:
On Sep 3, 3:52 am, Mensanator <mensana...@aol.com> wrote:

On Sep 2, 11:55 am, Steven D'Aprano <st...@REMOVE-THIS-

if (p & 1)==1:
print_evens = True
else:
print_evens = False
if (p & 2)==2:
print_odds = True
else:
print_odds = False
if (p & 4)==4:
print_debug = True
else:
print_debug = False

No, no, no, you've taken "How to write verbose scripts" rather too
literally; try this:

print_evens = p & 1
print_odds = p & 2
print_debug = p & 4

Thanks for that. Luckily, the code only does that once per call.
 

 
Bruno Desthuilliers
PostPosted: Wed Sep 03, 2008 9:14 am    Post subject: Re: How to write verbose scripts
       
John Machin a écrit :
Quote:
On Sep 3, 3:52 am, Mensanator <mensana...@aol.com> wrote:
On Sep 2, 11:55 am, Steven D'Aprano <st...@REMOVE-THIS-

if (p & 1)==1:
print_evens = True
else:
print_evens = False
if (p & 2)==2:
print_odds = True
else:
print_odds = False
if (p & 4)==4:
print_debug = True
else:
print_debug = False

No, no, no, you've taken "How to write verbose scripts" rather too
literally;

KEYBOARD !
 

 
BJörn Lindqvist
PostPosted: Wed Sep 03, 2008 10:50 am    Post subject: Re: How to write verbose scripts
       
2008/9/3 Hendrik van Rooyen <mail@microcorp.co.za>:
Quote:

Steven D'Aprano <stev...bersource.com.au> wrote:

Is there a better way of doing this than the way I am going about it?

Not sure if its "better", but I would keep the messages in a table or dict and
have different tables or dicts for different levels of verbosity, and write a
displayer that knows about the verbosity - This approach has the advantage that
you can write in English and have different verbosities in different languages
too, if the displayer knows about the language.

One big downside with that approach is that it becomes much harder to
grep for the log message. Usually when I go through logs, I don't care
what exactly the message says, just that it is easily googleable (uses
some kind of identifying text) and that it is unique so I can know
exactly where it was emitted.


--
mvh Björn
 

 
Uwe Schmitt
PostPosted: Wed Sep 03, 2008 11:31 am    Post subject: Re: How to write verbose scripts
       
On 2 Sep., 18:55, Steven D'Aprano <st...@REMOVE-THIS-
cybersource.com.au> wrote:
Quote:
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?

--
Steven

You can save some code if you use function decorators for logging
input and output values of
functions.
So write lots of functions containing one statement and your problem
is solved ;-)

Greetings, Uwe
 

Page 1 of 2 .:. Goto page 1, 2  Next

Google
 
Webnews.only-4-geeks.com

Windows Update | C++ | C | PHP | JavaScript | Photoshop | Programming | Windows 2000 | Python | Windows XP | Object | Flash | Flash - ActionScript | Paint Shop Pro | Excel | PowerPoint | Access | Word | Windows 98 | Internet Explorer 6.0 | CorelDraw12 | Java | XML | asm x86 | Linux Mandrake | Linux RedHat | Outlook |  | news from newsgroups |_ | s

Web Templates

Awesome Website Templates ©

ubezpieczenie ac oprocentowanie lokat apteka zasiłek Quotations