I love assert

Anton anschatten at gmail.com
Wed Nov 12 17:13:59 EST 2014


On Wednesday, November 12, 2014 2:05:17 PM UTC-8, Ian wrote:
> On Wed, Nov 12, 2014 at 2:56 PM, Marko Rauhamaa wrote:
> > Ethan Furman:
> >
> >> On 11/12/2014 01:41 PM, Marko Rauhamaa wrote:
> >>>
> >>> Or I might indicate the exhaustion of possibilities:
> >>>
> >>>       if status == OK:
> >>>           ...
> >>>       elif status == ERROR:
> >>>           ...
> >>>       else:
> >>>           assert status == WARNING
> >>>           ...
> >>
> >> And here's a nice example of what one should NOT do. Imagine that a
> >> new status, CONFUSED is added, the above code is not modified to
> >> handle it, and for whatever reason the program is being run optimized
> >> -- the assert is not there, and CONFUSED is treated the same as
> >> WARNING.
> >
> > How would it be better if you removed the assert then?
> 
> You don't need to remove it. Just reorganize it to make sure it
> indicates actual exhaustion of possibilities. E.g. using the "assert
> False" pattern from your post:
> 
> if status == OK:
>     ...
> elif status == ERROR:
>     ...
> elif status == WARNING:
>     ...
> else:
>     assert False

If the code is run optimized and asserts are ignore CONFUSED statement would still not be handled and you will not know about it.
I would do something like:

if status == OK:
    ...
elif status == ERROR:
    ...
elif status == WARNING:
    ...
else:
    raise RuntimeError("Unknown errorno")

Or if it is at the end of the function, then:

if status == OK:
    ...
elif status == ERROR:
    ...
elif status == WARNING:
    ...

raise RuntimeError("Unknown errorno")

unless there is a customer exception type I can use for this situation.



More information about the Python-list mailing list