diff options
author | Raymond Hettinger <python@rcn.com> | 2004-12-05 09:25:51 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2004-12-05 09:25:51 (GMT) |
commit | b2594050ea83d0fc9ddaeed2e33ec2436e9ca1bc (patch) | |
tree | fa2dd706cc0a7fe9136216fb0c45c88088205df8 /Modules/itertoolsmodule.c | |
parent | d2f70cbe8e2a0e50c2991071305450dbdaf0389a (diff) | |
download | cpython-b2594050ea83d0fc9ddaeed2e33ec2436e9ca1bc.zip cpython-b2594050ea83d0fc9ddaeed2e33ec2436e9ca1bc.tar.gz cpython-b2594050ea83d0fc9ddaeed2e33ec2436e9ca1bc.tar.bz2 |
Added optional None arguments to itertools.islice().
Diffstat (limited to 'Modules/itertoolsmodule.c')
-rw-r--r-- | Modules/itertoolsmodule.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index bf148ac..31ba13a 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -1044,14 +1044,14 @@ islice_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { PyObject *seq; long start=0, stop=-1, step=1; - PyObject *it, *a1=NULL, *a2=NULL; + PyObject *it, *a1=NULL, *a2=NULL, *a3=NULL; int numargs; isliceobject *lz; - numargs = PyTuple_Size(args); - if (!PyArg_ParseTuple(args, "OO|Ol:islice", &seq, &a1, &a2, &step)) + if (!PyArg_UnpackTuple(args, "islice", 2, 4, &seq, &a1, &a2, &a3)) return NULL; + numargs = PyTuple_Size(args); if (numargs == 2) { if (a1 != Py_None) { stop = PyInt_AsLong(a1); @@ -1059,39 +1059,41 @@ islice_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (PyErr_Occurred()) PyErr_Clear(); PyErr_SetString(PyExc_ValueError, - "Stop argument must be a non-negative integer or None."); + "Stop argument for islice() must be a non-negative integer or None."); return NULL; } } } else { - start = PyInt_AsLong(a1); - if (start == -1 && PyErr_Occurred()) { + if (a1 != Py_None) + start = PyInt_AsLong(a1); + if (start == -1 && PyErr_Occurred()) PyErr_Clear(); - PyErr_SetString(PyExc_ValueError, - "Start argument must be a non-negative integer."); - return NULL; - } if (a2 != Py_None) { stop = PyInt_AsLong(a2); if (stop == -1) { if (PyErr_Occurred()) PyErr_Clear(); PyErr_SetString(PyExc_ValueError, - "Stop argument must be a non-negative integer or None."); + "Stop argument for islice() must be a non-negative integer or None."); return NULL; } } } - if (start<0 || stop<-1) { PyErr_SetString(PyExc_ValueError, - "Indices for islice() must be non-negative integers."); + "Indices for islice() must be non-negative integers or None."); return NULL; } + if (a3 != NULL) { + if (a3 != Py_None) + step = PyInt_AsLong(a3); + if (step == -1 && PyErr_Occurred()) + PyErr_Clear(); + } if (step<1) { PyErr_SetString(PyExc_ValueError, - "Step must be one or larger for islice()."); + "Step for islice() must be a positive integer or None."); return NULL; } |