cleaner way to write this try/except statement?

Boris Borcic bborcic at gmail.com
Thu Aug 3 15:04:38 EDT 2006


Simon Forman wrote:
> Boris Borcic wrote:
>> 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
>> well, assuming you are unsatisfied with the above, you could try to assert the
>> validation condition and catch together all failures, eg :
>>
>> def Validate(self, parent):
>>          text_ctrl = self.GetWindow()
>>          text = text_ctrl.GetValue()
>>          try :
>>              assert int(text)>0
>>              return True
>>          except (ValueError,AssertionError) :
>>              wx.MessageBox('Enter a valid time.', 'Invalid time entered',
>>                            wx.OK | wx.ICON_ERROR)
>>              return False
>>
>> hth, BB
> 
> Assertion statements "go away" when you run python with the '-O' or
> '-OO' options.  

Makes me wonder how many use those options. I never do, this explains that.

 > They're only meant for debugging and shouldn't be used
 > as part of your actual program logic.

That's too bad, and bound to evolve if the logic object space of Pypy gains users.

> 
> You run the risk of introducing hard-to-find bugs if you use them like
> this and somebody, somewhere, sometime runs your code in "optimized"
> mode.

Well, I wouldn't formulate it quite like that, but, as you say,...

> 
> Peace,
> ~Simon
> 

Well, in that case let's just define

def fail(exc) : raise exc

and replace

assert int(text)>0

by

int(text)>0 or fail(ValueError)

cheers, BB
--
"On naît tous les mètres du même monde"




More information about the Python-list mailing list