mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
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:
parent
14ef54cd83
commit
341deb74e7
3 changed files with 10 additions and 13 deletions
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue