bpo-20180: itertools.groupby Argument Clinic conversion (GH-4170)

This commit is contained in:
Tal Einat 2018-09-10 21:33:08 +03:00 committed by Raymond Hettinger
parent 9430652535
commit 3286ce4ade
2 changed files with 107 additions and 25 deletions

64
Modules/clinic/itertoolsmodule.c.h generated Normal file
View File

@ -0,0 +1,64 @@
/*[clinic input]
preserve
[clinic start generated code]*/
PyDoc_STRVAR(itertools_groupby__doc__,
"groupby(iterable, key=None)\n"
"--\n"
"\n"
"make an iterator that returns consecutive keys and groups from the iterable\n"
"\n"
" iterable\n"
" Elements to divide into groups according to the key function.\n"
" key\n"
" A function for computing the group category for each element.\n"
" If the key function is not specified or is None, the element itself\n"
" is used for grouping.");
static PyObject *
itertools_groupby_impl(PyTypeObject *type, PyObject *it, PyObject *keyfunc);
static PyObject *
itertools_groupby(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
PyObject *return_value = NULL;
static const char * const _keywords[] = {"iterable", "key", NULL};
static _PyArg_Parser _parser = {"O|O:groupby", _keywords, 0};
PyObject *it;
PyObject *keyfunc = Py_None;
if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser,
&it, &keyfunc)) {
goto exit;
}
return_value = itertools_groupby_impl(type, it, keyfunc);
exit:
return return_value;
}
static PyObject *
itertools__grouper_impl(PyTypeObject *type, PyObject *parent,
PyObject *tgtkey);
static PyObject *
itertools__grouper(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
PyObject *return_value = NULL;
PyObject *parent;
PyObject *tgtkey;
if ((type == &_grouper_type) &&
!_PyArg_NoKeywords("_grouper", kwargs)) {
goto exit;
}
if (!PyArg_ParseTuple(args, "O!O:_grouper",
&groupby_type, &parent, &tgtkey)) {
goto exit;
}
return_value = itertools__grouper_impl(type, parent, tgtkey);
exit:
return return_value;
}
/*[clinic end generated code: output=82e10c91569d2b95 input=a9049054013a1b77]*/

View File

@ -7,6 +7,17 @@
by Raymond D. Hettinger <python@rcn.com> by Raymond D. Hettinger <python@rcn.com>
*/ */
/*[clinic input]
module itertools
class itertools.groupby "groupbyobject *" "&groupby_type"
class itertools._grouper "_grouperobject *" "&_grouper_type"
[clinic start generated code]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=9d506f5bb9177570]*/
static PyTypeObject groupby_type;
static PyTypeObject _grouper_type;
#include "clinic/itertoolsmodule.c.h"
/* groupby object ************************************************************/ /* groupby object ************************************************************/
@ -20,19 +31,27 @@ typedef struct {
const void *currgrouper; /* borrowed reference */ const void *currgrouper; /* borrowed reference */
} groupbyobject; } groupbyobject;
static PyTypeObject groupby_type;
static PyObject *_grouper_create(groupbyobject *, PyObject *); static PyObject *_grouper_create(groupbyobject *, PyObject *);
static PyObject * /*[clinic input]
groupby_new(PyTypeObject *type, PyObject *args, PyObject *kwds) @classmethod
{ itertools.groupby.__new__
static char *kwargs[] = {"iterable", "key", NULL};
groupbyobject *gbo;
PyObject *it, *keyfunc = Py_None;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:groupby", kwargs, iterable as it: object
&it, &keyfunc)) Elements to divide into groups according to the key function.
return NULL; key as keyfunc: object = None
A function for computing the group category for each element.
If the key function is not specified or is None, the element itself
is used for grouping.
make an iterator that returns consecutive keys and groups from the iterable
[clinic start generated code]*/
static PyObject *
itertools_groupby_impl(PyTypeObject *type, PyObject *it, PyObject *keyfunc)
/*[clinic end generated code: output=cbb1ae3a90fd4141 input=6b3d123e87ff65a1]*/
{
groupbyobject *gbo;
gbo = (groupbyobject *)type->tp_alloc(type, 0); gbo = (groupbyobject *)type->tp_alloc(type, 0);
if (gbo == NULL) if (gbo == NULL)
@ -186,11 +205,6 @@ static PyMethodDef groupby_methods[] = {
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };
PyDoc_STRVAR(groupby_doc,
"groupby(iterable, key=None) -> make an iterator that returns consecutive\n\
keys and groups from the iterable. If the key function is not specified or\n\
is None, the element itself is used for grouping.\n");
static PyTypeObject groupby_type = { static PyTypeObject groupby_type = {
PyVarObject_HEAD_INIT(NULL, 0) PyVarObject_HEAD_INIT(NULL, 0)
"itertools.groupby", /* tp_name */ "itertools.groupby", /* tp_name */
@ -214,7 +228,7 @@ static PyTypeObject groupby_type = {
0, /* tp_as_buffer */ 0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Py_TPFLAGS_BASETYPE, /* tp_flags */ Py_TPFLAGS_BASETYPE, /* tp_flags */
groupby_doc, /* tp_doc */ itertools_groupby__doc__, /* tp_doc */
(traverseproc)groupby_traverse, /* tp_traverse */ (traverseproc)groupby_traverse, /* tp_traverse */
0, /* tp_clear */ 0, /* tp_clear */
0, /* tp_richcompare */ 0, /* tp_richcompare */
@ -231,7 +245,7 @@ static PyTypeObject groupby_type = {
0, /* tp_dictoffset */ 0, /* tp_dictoffset */
0, /* tp_init */ 0, /* tp_init */
0, /* tp_alloc */ 0, /* tp_alloc */
groupby_new, /* tp_new */ itertools_groupby, /* tp_new */
PyObject_GC_Del, /* tp_free */ PyObject_GC_Del, /* tp_free */
}; };
@ -244,16 +258,20 @@ typedef struct {
PyObject *tgtkey; PyObject *tgtkey;
} _grouperobject; } _grouperobject;
static PyTypeObject _grouper_type; /*[clinic input]
@classmethod
itertools._grouper.__new__
parent: object(subclass_of='&groupby_type')
tgtkey: object
/
[clinic start generated code]*/
static PyObject * static PyObject *
_grouper_new(PyTypeObject *type, PyObject *args, PyObject *kwds) itertools__grouper_impl(PyTypeObject *type, PyObject *parent,
PyObject *tgtkey)
/*[clinic end generated code: output=462efb1cdebb5914 input=dc180d7771fc8c59]*/
{ {
PyObject *parent, *tgtkey;
if (!PyArg_ParseTuple(args, "O!O", &groupby_type, &parent, &tgtkey))
return NULL;
return _grouper_create((groupbyobject*) parent, tgtkey); return _grouper_create((groupbyobject*) parent, tgtkey);
} }
@ -374,7 +392,7 @@ static PyTypeObject _grouper_type = {
0, /* tp_dictoffset */ 0, /* tp_dictoffset */
0, /* tp_init */ 0, /* tp_init */
0, /* tp_alloc */ 0, /* tp_alloc */
_grouper_new, /* tp_new */ itertools__grouper, /* tp_new */
PyObject_GC_Del, /* tp_free */ PyObject_GC_Del, /* tp_free */
}; };