[Python-ideas] A general purpose range iterator (Re: improvements to slicing)

Nick Coghlan ncoghlan at gmail.com
Wed Oct 6 22:41:21 CEST 2010


On Thu, Oct 7, 2010 at 5:21 AM, Ron Adam <rrr at ronadam.com> wrote:
> I think these are easier to use than the current behavior.  It doesn't
> change slices using positive indexes and steps so maybe it's not so backward
> incompatible to sneak in.  ;-)

I think that sound you just heard was thousands of SciPy users crying
out in horror ;)

Given a "do over", there a few things I would change about Python's
range generation and extended slicing. Others would clearly change a
few different things. Given the dual barriers of "rough consensus and
running code", I don't think there are any *specific* changes that
would make it through the gauntlet.

The idea of a *generalised* range generator is in interesting one
though. One that was simply:

_d = object()
def irange(start=_d, stop=_d, step=1, *, include_start=True,
include_stop=False):
    # Match signature of range while still allowing stop=val as the
only keyword argument
    if stop is _d:
        start, stop = 0, start
    elif start is _d:
        start = 0
    if include_start:
        yield start
    current = start
    while 1:
        current += step
        if current >= stop:
            break
        yield current
    if include_stop and current == stop:
        yield stop

Slower than builtin range() for the integer case, but works with
arbitrary types (e.g. float, Decimal, datetime)

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia



More information about the Python-ideas mailing list