bpo-30537: use PyNumber in itertools.islice instead of PyLong (#1918)
* bpo-30537: use PyNumber in itertools instead of PyLong * bpo-30537: revert changes except to islice_new * bpo-30537: test itertools.islice and add entry to Misc/NEWS
This commit is contained in:
parent
5edf827c80
commit
0ecdc52514
|
@ -1243,6 +1243,19 @@ class TestBasicOps(unittest.TestCase):
|
||||||
support.gc_collect()
|
support.gc_collect()
|
||||||
self.assertIsNone(wr())
|
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):
|
def test_takewhile(self):
|
||||||
data = [1, 3, 5, 20, 2, 4, 6, 8]
|
data = [1, 3, 5, 20, 2, 4, 6, 8]
|
||||||
self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
|
self.assertEqual(list(takewhile(underten, data)), [1, 3, 5])
|
||||||
|
|
|
@ -128,6 +128,9 @@ Core and Builtins
|
||||||
|
|
||||||
- bpo-29546: Improve from-import error message with location
|
- 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 #29319: Prevent RunMainFromImporter overwriting sys.path[0].
|
||||||
|
|
||||||
- Issue #29337: Fixed possible BytesWarning when compare the code objects.
|
- Issue #29337: Fixed possible BytesWarning when compare the code objects.
|
||||||
|
|
|
@ -1417,7 +1417,7 @@ islice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
numargs = PyTuple_Size(args);
|
numargs = PyTuple_Size(args);
|
||||||
if (numargs == 2) {
|
if (numargs == 2) {
|
||||||
if (a1 != Py_None) {
|
if (a1 != Py_None) {
|
||||||
stop = PyLong_AsSsize_t(a1);
|
stop = PyNumber_AsSsize_t(a1, PyExc_OverflowError);
|
||||||
if (stop == -1) {
|
if (stop == -1) {
|
||||||
if (PyErr_Occurred())
|
if (PyErr_Occurred())
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
|
@ -1429,11 +1429,11 @@ islice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (a1 != Py_None)
|
if (a1 != Py_None)
|
||||||
start = PyLong_AsSsize_t(a1);
|
start = PyNumber_AsSsize_t(a1, PyExc_OverflowError);
|
||||||
if (start == -1 && PyErr_Occurred())
|
if (start == -1 && PyErr_Occurred())
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
if (a2 != Py_None) {
|
if (a2 != Py_None) {
|
||||||
stop = PyLong_AsSsize_t(a2);
|
stop = PyNumber_AsSsize_t(a2, PyExc_OverflowError);
|
||||||
if (stop == -1) {
|
if (stop == -1) {
|
||||||
if (PyErr_Occurred())
|
if (PyErr_Occurred())
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
|
@ -1453,7 +1453,7 @@ islice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
|
|
||||||
if (a3 != NULL) {
|
if (a3 != NULL) {
|
||||||
if (a3 != Py_None)
|
if (a3 != Py_None)
|
||||||
step = PyLong_AsSsize_t(a3);
|
step = PyNumber_AsSsize_t(a3, PyExc_OverflowError);
|
||||||
if (step == -1 && PyErr_Occurred())
|
if (step == -1 && PyErr_Occurred())
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue