summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_itertools.py13
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/itertoolsmodule.c8
3 files changed, 20 insertions, 4 deletions
diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py
index f525255..50cf148 100644
--- a/Lib/test/test_itertools.py
+++ b/Lib/test/test_itertools.py
@@ -1243,6 +1243,19 @@ class TestBasicOps(unittest.TestCase):
support.gc_collect()
self.assertIsNone(wr())
+ # Issue #30537: islice can accept integer-like objects as
+ # arguments
+ class IntLike(object):
+ def __init__(self, val):
+ self.val = val
+ def __index__(self):
+ return self.val
+ self.assertEqual(list(islice(range(100), IntLike(10))), list(range(10)))
+ self.assertEqual(list(islice(range(100), IntLike(10), IntLike(50))),
+ list(range(10, 50)))
+ self.assertEqual(list(islice(range(100), IntLike(10), IntLike(50), IntLike(5))),
+ list(range(10,50,5)))
+
def test_takewhile(self):
data = [1, 3, 5, 20, 2, 4, 6, 8]
self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
diff --git a/Misc/NEWS b/Misc/NEWS
index f043832..0bc33bb 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -128,6 +128,9 @@ Core and Builtins
- bpo-29546: Improve from-import error message with location
+- bpo-30537: itertools.islice now accepts integer-like objects (having
+ an __index__ method) as start, stop, and slice arguments
+
- Issue #29319: Prevent RunMainFromImporter overwriting sys.path[0].
- Issue #29337: Fixed possible BytesWarning when compare the code objects.
diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c
index fac5b29..ee7bb66 100644
--- a/Modules/itertoolsmodule.c
+++ b/Modules/itertoolsmodule.c
@@ -1417,7 +1417,7 @@ islice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
numargs = PyTuple_Size(args);
if (numargs == 2) {
if (a1 != Py_None) {
- stop = PyLong_AsSsize_t(a1);
+ stop = PyNumber_AsSsize_t(a1, PyExc_OverflowError);
if (stop == -1) {
if (PyErr_Occurred())
PyErr_Clear();
@@ -1429,11 +1429,11 @@ islice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
}
} else {
if (a1 != Py_None)
- start = PyLong_AsSsize_t(a1);
+ start = PyNumber_AsSsize_t(a1, PyExc_OverflowError);
if (start == -1 && PyErr_Occurred())
PyErr_Clear();
if (a2 != Py_None) {
- stop = PyLong_AsSsize_t(a2);
+ stop = PyNumber_AsSsize_t(a2, PyExc_OverflowError);
if (stop == -1) {
if (PyErr_Occurred())
PyErr_Clear();
@@ -1453,7 +1453,7 @@ islice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (a3 != NULL) {
if (a3 != Py_None)
- step = PyLong_AsSsize_t(a3);
+ step = PyNumber_AsSsize_t(a3, PyExc_OverflowError);
if (step == -1 && PyErr_Occurred())
PyErr_Clear();
}