What are some other way to rewrite this if block?

Duncan Booth duncan.booth at invalid.invalid
Mon Mar 18 10:43:50 EDT 2013


Jussi Piitulainen <jpiitula at ling.helsinki.fi> wrote:

>> Any tips are welcome.
> 
> A double tip:
> 
> if (not (0.0 <= should_be_on <= 24.0) or
>     not (0.0 <= came_on <= 24.0)):
>    ...
> 
Or even:

    if not (0.0 <= should_be_on <= 24.0 and 0.0 <= came_on <= 24.0):
        ...

> You might want to raise an exception from the range-check branch
> instead of returning a value. And raise an exception from the
> else-branch, because that branch should never be reached.

Or even lose the else branch entirely. If the code can never be reached 
then don't write it. Also you don't need 'elif' when the individual 
branches all return.

Putting that together and allowing some flexibility in the definition of 
'on time':

EARLY_DELTA = 1.0/60
LATE_DELTA = 5.0/60

def report_status(should_be_on, came_on):
    if not (0.0 <= should_be_on <= 24.0 and 0.0 <= came_on <= 24.0):
        raise ValueError('time not in range')

    if should_be_on - EARLY_DELTA <= came_on <= should_be_on + LATE_DELTA:
        return 'on time'

    if came_on > should_be_on:
        return 'delayed'

    return 'early'

Note that none of this will hande situations around midnight such as: 
should_be_on==23.5, came_on=0.5

-- 
Duncan Booth http://kupuguy.blogspot.com



More information about the Python-list mailing list