On 11/4/2010 12:42 PM, Shashank Singh wrote:
Are there any promises made with regard to final state of the underlying sequence that islice slices?
The one you quote below.
for example consider this >>> from itertools import * >>> c = count() >>> list(islice(c, 1, 3, 50)) [1] >>> c.next() 51
When posting code and result, it is always a good idea to include version. It is even more important when reporting a (possible) bug, which might have been fixed already. As it turns out, I get the same behavior above and below with 3.1.2.
Now, the doc [1] says "If /stop/ is None, then iteration continues until the iterator is exhausted, if at all; otherwise, it stops at the specified position".
With a step greater than 1, 'specified position' is ambiguous. Any stop value in [2,51] gives the same result. One could argue that the effective stop value is either last returned + step as above does, or last returned + 1 as Python version does.
It clearly is not stopping at stop (3). Further, the doc gives an example of how this is *equivalent* to a generator defined in the same section. It turns out, these two are not exactly the same if the side-effect of the code is considered on the underlying sequence. Redefining islice using the generator function defined in the doc gives different (and from one pov, expected) result >>> def islice(iterable, *args): ... # islice('ABCDEFG', 2) --> A B ... >>> c = count() >>> list(islice(c, 1, 3, 50)) [1] >>> c.next() 2 While "fixing" this should be rather easy in terms of the change in code required it might break any code depending on this seemingly incorrect behavior. [1]. http://docs.python.org/library/itertools.html#itertools.islice
If you file a bug report, please give the link. If you do not want to, say so and I will. -- Terry Jan Reedy -- http://mail.python.org/mailman/listinfo/python-list