[Python-Dev] Bad interaction of index and sequence repeat (original) (raw)

Armin Rigo arigo at tunes.org
Sat Jul 29 10:56:12 CEST 2006


Hi Guido,

On Fri, Jul 28, 2006 at 11:31:09AM -0700, Guido van Rossum wrote:

No time to look through the code here, but IMO it's acceptable (at least for 2.5) if (2**100).index() raises OverflowError, as long as x[:2**100] silently clips. index() is primarily meant to return a value useful for indexing concrete sequences, and 2**100 isn't.

If nb_index keeps returning a Py_ssize_t with clipping, it means that there is no way to write in pure Python an object that emulates a long -- only an int. Sounds inconsistent with the int/long unification trend for pure Python code. It would make it awkward to write, say, pure Python classes that pretend to be very large sequences, because using index in such code wouldn't work.

Another example of this is that if places like sequence_repeat are made to use the following pseudo-logic:

if isinstance(w, long) and w > sys.maxint:
    raise OverflowError
else:
    i = w.__index__()

then if an object 'l' is an emulated pseudo-long, then "x"*l will still silently clip the pseudo-long to sys.maxint.

I'm more in favor of changing nb_index to return a PyObject *, since now is our last chance to do so. A pair of API functions can be added to return a Py_ssize_t with either the proper clipping, or the proper OverflowError'ing.

A bientot,

Armin.



More information about the Python-Dev mailing list