meta-class review

MRAB python at mrabarnett.plus.com
Tue Oct 5 20:16:27 EDT 2010


On 06/10/2010 00:17, Ethan Furman wrote:
 > On one the many mini-reports we use, we have a bunch of counts that
 > are frequently zero; because the other counts can also be low, it
 > becomes easy to miss the non-zero counts.  For example:
 >
 > Code  Description
 >
 >       Conv Errors              :       6
 >
 > 31,N  DPV Failure              :       4
 > 10:   Invalid Address          :       0
 > 11:   Invalid C/S/Z            :       0
 > 12:   Invalid State            :       0
 > 13:   Invalid City             :       0
 > 17:   Insufficient Information :       0
 > 33:   Non-Deliverable          :       0
 > 98:   Non-USPS zip             :       0
 >
 > 21:   Address Not Found        :       0
 > 22:   Multiple Responses       :       3
 > 23:   Error in Primary         :       0
 > 24:   Error in Secondary       :       0
 >
 >
 > So I thought I would print '-' instead...
 >
 > Code  Description
 >
 >       Conv Errors              :       6
 >
 > 31,N  DPV Failure              :       4
 > 10:   Invalid Address          :       -
 > 11:   Invalid C/S/Z            :       -
 > 12:   Invalid State            :       -
 > 13:   Invalid City             :       -
 > 17:   Insufficient Information :       -
 > 33:   Non-Deliverable          :       -
 > 98:   Non-USPS zip             :       -
 >
 > 21:   Address Not Found        :       -
 > 22:   Multiple Responses       :       3
 > 23:   Error in Primary         :       -
 > 24:   Error in Secondary       :       -
 >
 >
 > Much easier to pick out the numbers now.  To support this, the code
 > changed slightly -- it went from
 >
 > '%-25s: %7d' % ('DPV Failure', counts['D'])
 >
 > to
 >
 > '%-25s: %7s' % ('DPV Failure', counts['D'] if counts['D'] else '-'))
 >
 > This became a pain after a dozen lines, prompting my previous
 > question about the difference between %s and %d when printing
 > integers.  With the excellent replies I received I coded a short
 > class:
 >
 > [snip]
 > Any comments appreciated, especially ideas on how to better handle
 > class- and staticmethods
 >
I think that's a bit of overkill. The problem lies in the printing
part, but you're spreading the solution into the rest of the
application! (A case of the tail wagging the dog, perhaps? :-))

IMHO you should just use a simple function when printing:

def dash_zero(x):
     return str(x) if x else '-'

...

'%-25s: %7s' % ('DPV Failure', dash_zero(counts['D']))



More information about the Python-list mailing list