|  | How to write verbose scripts |  | |
| | | Steven D'Aprano |  |
| Posted: 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 |  |
| Posted: 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 |  |
| Posted: 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 |  |
| Posted: 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]
|
| |
| | | MRAB |  |
| Posted: 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 |  |
| Posted: 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 |  |
| Posted: 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 |  |
| Posted: 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 |  |
| Posted: 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 |  |
| Posted: 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 | |
|
|