[Python-Dev] More int/long integration issues

Guido van Rossum guido@python.org
Thu, 13 Mar 2003 21:53:03 -0500


> I'm working on a patch that allows both range() and xrange() to work
> with large (PyLong) values.

I'm not interested for xrange().  As I said, xrange() is a crutch and
should not be given features that make it hard to kill.

For range(), sure, upload to SF.

> I noticed the need for a least supporting long values when I found some
> bugs in code that did things like:
> 
> a = 1/1e-5
> range( a-20, a)

This should be a TypeError.  I'm sorry it isn't.  range() is only
defined for ints, and unfortunately if you pass it a float it
truncates rather than failing.

> or
> 
> a = 1/1e-6
> b = 1/1e-5
> c = 1/1e-4
> range(a, b, c)

Ditto.

(BTW why don't you write this as 1e6, 1e5, 1e4???)

> Now, this example is hardcoded, but in graphing software, or other
> numerical work, the actual values come from the data set.  All of a
> sudden, you could be dealing with very small numbers (say, because you
> want to examine error values), and you get:
> 
> a = 1/1e-21
> b = 1/1e-20
> c = 1/1e-19
> range(a, b, c)
> 
> And your piece of code now fails.  By the comments I've seen, this
> failure tends to come as a big surprise (people are simply expecting
> range to be able to work with PyLong values, over short lengths).

But 1/1e-21 is not a long.  It's a float.  You're flirting with
disaster here.

> Also, someone who is working with large files (> C long on his machine)
> claimed to be having problems w/ xrange() failing (although, if he is
> indexing the xrange object, my patch can't help anyway)

That's a totally different problem.  Indeed you can't use xrange()
with values > sys.maxint.  But it should be easy to recode this
without xrange.

> I've seen enough people asking in the newsgroups about this behavior (at
> least four in the past 5 months or so), and I've submitted some
> application patches to make things work for these cases (ie. by
> explicitly subtracting out the large common base of each parameter, and
> adding it back in after the list is generated), so I decided to make a
> patch to change the range behavior.
> 
> Fixing range was relatively easy, and could be done with no performance
> penalty (the code to handle longs ranges is only invoked after the
> existing code path fails; the common case is unaltered).  Fixing
> xrange() is trickier, and I'm opting to maintain backwards compatibility
> as much as possible.
> 
> In any case, I should have the patch ready to submit within the next
> week or so (just a few hours more work is needed, for testing and
> cleanup)
> 
> Then the argument about whether it should ever be included can begin in
> earnest.  But I have seen enough examples of people being surprised that
> ranges of long values (where the range length is well within the
> addressable limit, but the range values must be PyLongs) that I think at
> least range() should be fixed.

Yes.

> And if range() is fixed, then sadly,
> xrange() should be fixed as well (IMO).

No.

> BTW, I'm all for deprecating xrange() with all deliberate speed.  Doing
> so would only make updating range behavior easier.

It can't be deprecated until we have an alternative.  That will have
to wait until Python 2.4.  I fought its addition to the language long
and hard, but the arguments from PBP (Practicality Beats Purity) were
too strong.

--Guido van Rossum (home page: http://www.python.org/~guido/)