cleaner way to write this try/except statement?

Peter Otten __peter__ at web.de
Wed Aug 2 03:55:43 EDT 2006


John Salerno wrote:

> The code to look at is the try statement in the NumbersValidator class,
> just a few lines down. Is this a clean way to write it? i.e. is it okay
> to have all those return statements? Is this a good use of try? Etc.
> 
> Thanks.
> 
> ----------------------------
> 
> import wx
> 
> 
> class NumbersValidator(wx.PyValidator):
> 
>      def __init__(self):
>          wx.PyValidator.__init__(self)
> 
>      def Clone(self):
>          return NumbersValidator()
> 
>      def Validate(self, parent):
>          text_ctrl = self.GetWindow()
>          text = text_ctrl.GetValue()
> 
>          try:
>              if not text or int(text) <= 0:
>                  wx.MessageBox('Enter a valid time.', 'Invalid time
> 
>                                entered', wx.OK | wx.ICON_ERROR)
>                  return False
>              else:
>                  return True
>          except ValueError, error:
>              wx.MessageBox('Enter a valid time.', 'Invalid time entered',
>                            wx.OK | wx.ICON_ERROR)
>              return False
> 
>      def TransferToWindow(self):
>          return True
> 
>      def TransferFromWindow(self):
>          return True

Here's how I might do it:

def is_positive_int_str(s):
    try:
        value = int(s)
    except ValueError:
        return False
    return value > 0

class PositiveIntegerValidator(wx.PyValidator):
    # ...
    def Validate(self, parent):
        text = self.GetWindow().GetValue()
        if is_positive_int_str(text):
            return True
        wx.MessageBox(...)
        return False

Two usability notes:
- "Invalid time entered" is a confusing message when you actually want a
positive integer.
- Pop-up messages are a major annoyance. An alternative would be to change
the text color of the control and show a hint as to what input you expect
in a status bar.

Peter




More information about the Python-list mailing list