The previous made the stop argument optional.

It is better to be explicit and just allow stop to be None.
This commit is contained in:
Raymond Hettinger 2003-05-02 19:44:20 +00:00
parent 14ef54cd83
commit 341deb74e7
3 changed files with 10 additions and 13 deletions

View file

@ -197,9 +197,9 @@ by functions or loops that truncate the stream.
If \var{start} is non-zero, then elements from the iterable are skipped If \var{start} is non-zero, then elements from the iterable are skipped
until start is reached. Afterward, elements are returned consecutively until start is reached. Afterward, elements are returned consecutively
unless \var{step} is set higher than one which results in items being unless \var{step} is set higher than one which results in items being
skipped. If \var{stop} is not specified or is \code{None}, then iteration skipped. If \var{stop} is \code{None}, then iteration continues until
continues indefinitely; otherwise, it stops at the specified position. the iterator is exhausted, if at all; otherwise, it stops at the specified
Unlike regular slicing, position. Unlike regular slicing,
\function{islice()} does not support negative values for \var{start}, \function{islice()} does not support negative values for \var{start},
\var{stop}, or \var{step}. Can be used to extract related fields \var{stop}, or \var{step}. Can be used to extract related fields
from data where the internal structure has been flattened (for from data where the internal structure has been flattened (for
@ -208,13 +208,10 @@ by functions or loops that truncate the stream.
\begin{verbatim} \begin{verbatim}
def islice(iterable, *args): def islice(iterable, *args):
if args:
s = slice(*args) s = slice(*args)
next = s.start or 0 next = s.start or 0
stop = s.stop stop = s.stop
step = s.step or 1 step = s.step or 1
else:
next, stop, step = 0, None, 1
for cnt, element in enumerate(iterable): for cnt, element in enumerate(iterable):
if cnt < next: if cnt < next:
continue continue

View file

@ -78,12 +78,12 @@ class TestBasicOps(unittest.TestCase):
self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs)) self.assertEqual(list(islice(xrange(100), *args)), range(*tgtargs))
# Test stop=None # Test stop=None
self.assertEqual(list(islice(xrange(10))), range(10))
self.assertEqual(list(islice(xrange(10), None)), range(10)) self.assertEqual(list(islice(xrange(10), None)), range(10))
self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10)) self.assertEqual(list(islice(xrange(10), 2, None)), range(2, 10))
self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2)) self.assertEqual(list(islice(xrange(10), 1, None, 2)), range(1, 10, 2))
# Test invalid arguments # Test invalid arguments
self.assertRaises(TypeError, islice, xrange(10))
self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4) self.assertRaises(TypeError, islice, xrange(10), 1, 2, 3, 4)
self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1) self.assertRaises(ValueError, islice, xrange(10), -5, 10, 1)
self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1) self.assertRaises(ValueError, islice, xrange(10), 1, -5, -1)

View file

@ -477,7 +477,7 @@ islice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
isliceobject *lz; isliceobject *lz;
numargs = PyTuple_Size(args); numargs = PyTuple_Size(args);
if (!PyArg_ParseTuple(args, "O|OOl:islice", &seq, &a1, &a2, &step)) if (!PyArg_ParseTuple(args, "OO|Ol:islice", &seq, &a1, &a2, &step))
return NULL; return NULL;
if (numargs == 2) { if (numargs == 2) {
@ -491,7 +491,7 @@ islice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return NULL; return NULL;
} }
} }
} else if (numargs == 3 || numargs == 4) { } else {
start = PyInt_AsLong(a1); start = PyInt_AsLong(a1);
if (start == -1 && PyErr_Occurred()) { if (start == -1 && PyErr_Occurred()) {
PyErr_Clear(); PyErr_Clear();