why won't slicing lists raise IndexError?

Rick Johnson rantingrickjohnson at gmail.com
Tue Dec 5 07:31:30 EST 2017


Ned Batchelder wrote:
[...]
> Your original statement sounded like, "The else clause can
> never be executed," 

No. Of course not. Note that i mentioned _pragmatism_. My
complaint about the else-clause was not that it could
_never_ be executed, my complaint that was that the else-
clause (in Terry's example) serves no useful purpose save to
act as a semantical placeholder for a non-action. Heck, it
doesn't even log anything! "Practicality beats purity". For
instance:

    (1) Would it be practical to make a shopping list that
    includes only the products you _don't_ want to buy?
        
        no ham
        no eggs
        no spam
        no Limburger
        
        "Okay, but what do we _need_!!!"
    
    (2) How about a list of navigation directions that includes
    tangential info?
    
        "After you take the second left turn, you'll see a big
        windmill -- just ignore that"

    (3) How about a recipe that includes non-ingredients?
        
        1 egg
        2 pounds of ham
        0 teaspoons coarse sea-salt
        0 cups of finely shreded Limburger
        ...

> which would have been in direct opposition to the point,
> that slicing outside the limits would produce an empty
> list, not an exception.

And again, that is precisely why i raised an objection to
this else-clause. Because the inclusion of this else-clause
is a distraction from the point.

> I'm not sure why you are certain that there's never a
> reason to execute code in that case.

Oh, there will be a _reason_ for else-clause to execute
(when the slice overlaps the boundary), but i argue the code
contained within is not a _good_ reason for it to execute.

    item = seq[n:n+1]
    if item:
        process(item)
    else:
        do_without_item()
         
"do_without_item()" implies a non-action. However, that's
not to say that under different circumstances, the else-
clause might serve a practical purpose for a programmer. For
instance, even a logging event serves a purpose.

    ss, se = n, n+1
    item = seq[ss:se]
    if item:
        process(item)
    else:
        print('Slice ({0}, {1}) out of bounds!'.format(ss, se))

> Perhaps I have a simulation on a conceptually infinite
> line, but only store the actual points needed.  The "non
> action" would be to extend the line.

That logic does not follow! How do you _extend_ an infinite
line? :-). Of course, in the realm of maths, a line is by
definition infinite.

But whether you're speaking in metaphor or not, there are
literally infinite ways in which an else-clause can be
justified. My argument was simply: "do_without_item()" is
not a legitimate justification.



More information about the Python-list mailing list