[Python-Dev] Bad interaction of __index__ and sequence repeat
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