mirror of
https://github.com/python/cpython
synced 2026-09-29 10:35:30 +03:00
bpo-30346: An iterator produced by the itertools.groupby() iterator (#1569)
now becames exhausted after advancing the groupby iterator.
This commit is contained in:
parent
4facdf523a
commit
c247caf33f
4 changed files with 34 additions and 3 deletions
|
|
@ -17,6 +17,7 @@ typedef struct {
|
|||
PyObject *tgtkey;
|
||||
PyObject *currkey;
|
||||
PyObject *currvalue;
|
||||
const void *currgrouper; /* borrowed reference */
|
||||
} groupbyobject;
|
||||
|
||||
static PyTypeObject groupby_type;
|
||||
|
|
@ -77,6 +78,7 @@ groupby_next(groupbyobject *gbo)
|
|||
{
|
||||
PyObject *newvalue, *newkey, *r, *grouper;
|
||||
|
||||
gbo->currgrouper = NULL;
|
||||
/* skip to next iteration group */
|
||||
for (;;) {
|
||||
if (gbo->currkey == NULL)
|
||||
|
|
@ -255,6 +257,7 @@ _grouper_create(groupbyobject *parent, PyObject *tgtkey)
|
|||
Py_INCREF(parent);
|
||||
igo->tgtkey = tgtkey;
|
||||
Py_INCREF(tgtkey);
|
||||
parent->currgrouper = igo; /* borrowed reference */
|
||||
|
||||
PyObject_GC_Track(igo);
|
||||
return (PyObject *)igo;
|
||||
|
|
@ -284,6 +287,8 @@ _grouper_next(_grouperobject *igo)
|
|||
PyObject *newvalue, *newkey, *r;
|
||||
int rcmp;
|
||||
|
||||
if (gbo->currgrouper != igo)
|
||||
return NULL;
|
||||
if (gbo->currvalue == NULL) {
|
||||
newvalue = PyIter_Next(gbo->it);
|
||||
if (newvalue == NULL)
|
||||
|
|
@ -321,6 +326,9 @@ _grouper_next(_grouperobject *igo)
|
|||
static PyObject *
|
||||
_grouper_reduce(_grouperobject *lz)
|
||||
{
|
||||
if (((groupbyobject *)lz->parent)->currgrouper != lz) {
|
||||
return Py_BuildValue("N(())", _PyObject_GetBuiltin("iter"));
|
||||
}
|
||||
return Py_BuildValue("O(OO)", Py_TYPE(lz), lz->parent, lz->tgtkey);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue