bpo-20180: convert most of itertoolsmodule.c to use Argument Clinic (GH-9164)

This commit is contained in:
Tal Einat 2018-09-12 00:49:13 +03:00 committed by Raymond Hettinger
parent 90fc8980bb
commit c4bccd3c76
2 changed files with 695 additions and 220 deletions

View File

@ -61,4 +61,452 @@ itertools__grouper(PyTypeObject *type, PyObject *args, PyObject *kwargs)
exit: exit:
return return_value; return return_value;
} }
/*[clinic end generated code: output=82e10c91569d2b95 input=a9049054013a1b77]*/
PyDoc_STRVAR(itertools_teedataobject__doc__,
"teedataobject(iterable, values, next, /)\n"
"--\n"
"\n"
"Data container common to multiple tee objects.");
static PyObject *
itertools_teedataobject_impl(PyTypeObject *type, PyObject *it,
PyObject *values, PyObject *next);
static PyObject *
itertools_teedataobject(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
PyObject *return_value = NULL;
PyObject *it;
PyObject *values;
PyObject *next;
if ((type == &teedataobject_type) &&
!_PyArg_NoKeywords("teedataobject", kwargs)) {
goto exit;
}
if (!PyArg_ParseTuple(args, "OO!O:teedataobject",
&it, &PyList_Type, &values, &next)) {
goto exit;
}
return_value = itertools_teedataobject_impl(type, it, values, next);
exit:
return return_value;
}
PyDoc_STRVAR(itertools__tee__doc__,
"_tee(iterable, /)\n"
"--\n"
"\n"
"Iterator wrapped to make it copyable.");
static PyObject *
itertools__tee_impl(PyTypeObject *type, PyObject *iterable);
static PyObject *
itertools__tee(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
PyObject *return_value = NULL;
PyObject *iterable;
if ((type == &tee_type) &&
!_PyArg_NoKeywords("_tee", kwargs)) {
goto exit;
}
if (!PyArg_UnpackTuple(args, "_tee",
1, 1,
&iterable)) {
goto exit;
}
return_value = itertools__tee_impl(type, iterable);
exit:
return return_value;
}
PyDoc_STRVAR(itertools_tee__doc__,
"tee($module, iterable, n=2, /)\n"
"--\n"
"\n"
"Returns a tuple of n independent iterators.");
#define ITERTOOLS_TEE_METHODDEF \
{"tee", (PyCFunction)itertools_tee, METH_FASTCALL, itertools_tee__doc__},
static PyObject *
itertools_tee_impl(PyObject *module, PyObject *iterable, Py_ssize_t n);
static PyObject *
itertools_tee(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
PyObject *iterable;
Py_ssize_t n = 2;
if (!_PyArg_ParseStack(args, nargs, "O|n:tee",
&iterable, &n)) {
goto exit;
}
return_value = itertools_tee_impl(module, iterable, n);
exit:
return return_value;
}
PyDoc_STRVAR(itertools_cycle__doc__,
"cycle(iterable, /)\n"
"--\n"
"\n"
"Return elements from the iterable until it is exhausted. Then repeat the sequence indefinitely.");
static PyObject *
itertools_cycle_impl(PyTypeObject *type, PyObject *iterable);
static PyObject *
itertools_cycle(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
PyObject *return_value = NULL;
PyObject *iterable;
if ((type == &cycle_type) &&
!_PyArg_NoKeywords("cycle", kwargs)) {
goto exit;
}
if (!PyArg_UnpackTuple(args, "cycle",
1, 1,
&iterable)) {
goto exit;
}
return_value = itertools_cycle_impl(type, iterable);
exit:
return return_value;
}
PyDoc_STRVAR(itertools_dropwhile__doc__,
"dropwhile(predicate, iterable, /)\n"
"--\n"
"\n"
"Drop items from the iterable while predicate(item) is true.\n"
"\n"
"Afterwards, return every element until the iterable is exhausted.");
static PyObject *
itertools_dropwhile_impl(PyTypeObject *type, PyObject *func, PyObject *seq);
static PyObject *
itertools_dropwhile(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
PyObject *return_value = NULL;
PyObject *func;
PyObject *seq;
if ((type == &dropwhile_type) &&
!_PyArg_NoKeywords("dropwhile", kwargs)) {
goto exit;
}
if (!PyArg_UnpackTuple(args, "dropwhile",
2, 2,
&func, &seq)) {
goto exit;
}
return_value = itertools_dropwhile_impl(type, func, seq);
exit:
return return_value;
}
PyDoc_STRVAR(itertools_takewhile__doc__,
"takewhile(predicate, iterable, /)\n"
"--\n"
"\n"
"Return successive entries from an iterable as long as the predicate evaluates to true for each entry.");
static PyObject *
itertools_takewhile_impl(PyTypeObject *type, PyObject *func, PyObject *seq);
static PyObject *
itertools_takewhile(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
PyObject *return_value = NULL;
PyObject *func;
PyObject *seq;
if ((type == &takewhile_type) &&
!_PyArg_NoKeywords("takewhile", kwargs)) {
goto exit;
}
if (!PyArg_UnpackTuple(args, "takewhile",
2, 2,
&func, &seq)) {
goto exit;
}
return_value = itertools_takewhile_impl(type, func, seq);
exit:
return return_value;
}
PyDoc_STRVAR(itertools_starmap__doc__,
"starmap(function, iterable, /)\n"
"--\n"
"\n"
"Return an iterator whose values are returned from the function evaluated with an argument tuple taken from the given sequence.");
static PyObject *
itertools_starmap_impl(PyTypeObject *type, PyObject *func, PyObject *seq);
static PyObject *
itertools_starmap(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
PyObject *return_value = NULL;
PyObject *func;
PyObject *seq;
if ((type == &starmap_type) &&
!_PyArg_NoKeywords("starmap", kwargs)) {
goto exit;
}
if (!PyArg_UnpackTuple(args, "starmap",
2, 2,
&func, &seq)) {
goto exit;
}
return_value = itertools_starmap_impl(type, func, seq);
exit:
return return_value;
}
PyDoc_STRVAR(itertools_chain_from_iterable__doc__,
"from_iterable($type, iterable, /)\n"
"--\n"
"\n"
"Alternative chain() constructor taking a single iterable argument that evaluates lazily.");
#define ITERTOOLS_CHAIN_FROM_ITERABLE_METHODDEF \
{"from_iterable", (PyCFunction)itertools_chain_from_iterable, METH_O|METH_CLASS, itertools_chain_from_iterable__doc__},
PyDoc_STRVAR(itertools_combinations__doc__,
"combinations(iterable, r)\n"
"--\n"
"\n"
"Return successive r-length combinations of elements in the iterable.\n"
"\n"
"combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)");
static PyObject *
itertools_combinations_impl(PyTypeObject *type, PyObject *iterable,
Py_ssize_t r);
static PyObject *
itertools_combinations(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
PyObject *return_value = NULL;
static const char * const _keywords[] = {"iterable", "r", NULL};
static _PyArg_Parser _parser = {"On:combinations", _keywords, 0};
PyObject *iterable;
Py_ssize_t r;
if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser,
&iterable, &r)) {
goto exit;
}
return_value = itertools_combinations_impl(type, iterable, r);
exit:
return return_value;
}
PyDoc_STRVAR(itertools_combinations_with_replacement__doc__,
"combinations_with_replacement(iterable, r)\n"
"--\n"
"\n"
"Return successive r-length combinations of elements in the iterable allowing individual elements to have successive repeats.\n"
"\n"
"combinations_with_replacement(\'ABC\', 2) --> AA AB AC BB BC CC\"");
static PyObject *
itertools_combinations_with_replacement_impl(PyTypeObject *type,
PyObject *iterable,
Py_ssize_t r);
static PyObject *
itertools_combinations_with_replacement(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
PyObject *return_value = NULL;
static const char * const _keywords[] = {"iterable", "r", NULL};
static _PyArg_Parser _parser = {"On:combinations_with_replacement", _keywords, 0};
PyObject *iterable;
Py_ssize_t r;
if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser,
&iterable, &r)) {
goto exit;
}
return_value = itertools_combinations_with_replacement_impl(type, iterable, r);
exit:
return return_value;
}
PyDoc_STRVAR(itertools_permutations__doc__,
"permutations(iterable, r=None)\n"
"--\n"
"\n"
"Return successive r-length permutations of elements in the iterable.\n"
"\n"
"permutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)");
static PyObject *
itertools_permutations_impl(PyTypeObject *type, PyObject *iterable,
PyObject *robj);
static PyObject *
itertools_permutations(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
PyObject *return_value = NULL;
static const char * const _keywords[] = {"iterable", "r", NULL};
static _PyArg_Parser _parser = {"O|O:permutations", _keywords, 0};
PyObject *iterable;
PyObject *robj = Py_None;
if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser,
&iterable, &robj)) {
goto exit;
}
return_value = itertools_permutations_impl(type, iterable, robj);
exit:
return return_value;
}
PyDoc_STRVAR(itertools_accumulate__doc__,
"accumulate(iterable, func=None)\n"
"--\n"
"\n"
"Return series of accumulated sums (or other binary function results).");
static PyObject *
itertools_accumulate_impl(PyTypeObject *type, PyObject *iterable,
PyObject *binop);
static PyObject *
itertools_accumulate(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
PyObject *return_value = NULL;
static const char * const _keywords[] = {"iterable", "func", NULL};
static _PyArg_Parser _parser = {"O|O:accumulate", _keywords, 0};
PyObject *iterable;
PyObject *binop = Py_None;
if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser,
&iterable, &binop)) {
goto exit;
}
return_value = itertools_accumulate_impl(type, iterable, binop);
exit:
return return_value;
}
PyDoc_STRVAR(itertools_compress__doc__,
"compress(data, selectors)\n"
"--\n"
"\n"
"Return data elements corresponding to true selector elements.\n"
"\n"
"Forms a shorter iterator from selected data elements using the selectors to\n"
"choose the data elements.");
static PyObject *
itertools_compress_impl(PyTypeObject *type, PyObject *seq1, PyObject *seq2);
static PyObject *
itertools_compress(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
PyObject *return_value = NULL;
static const char * const _keywords[] = {"data", "selectors", NULL};
static _PyArg_Parser _parser = {"OO:compress", _keywords, 0};
PyObject *seq1;
PyObject *seq2;
if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser,
&seq1, &seq2)) {
goto exit;
}
return_value = itertools_compress_impl(type, seq1, seq2);
exit:
return return_value;
}
PyDoc_STRVAR(itertools_filterfalse__doc__,
"filterfalse(function, iterable, /)\n"
"--\n"
"\n"
"Return those items of iterable for which function(item) is false.\n"
"\n"
"If function is None, return the items that are false.");
static PyObject *
itertools_filterfalse_impl(PyTypeObject *type, PyObject *func, PyObject *seq);
static PyObject *
itertools_filterfalse(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
PyObject *return_value = NULL;
PyObject *func;
PyObject *seq;
if ((type == &filterfalse_type) &&
!_PyArg_NoKeywords("filterfalse", kwargs)) {
goto exit;
}
if (!PyArg_UnpackTuple(args, "filterfalse",
2, 2,
&func, &seq)) {
goto exit;
}
return_value = itertools_filterfalse_impl(type, func, seq);
exit:
return return_value;
}
PyDoc_STRVAR(itertools_count__doc__,
"count(start=0, step=1)\n"
"--\n"
"\n"
"Return a count object whose .__next__() method returns consecutive values.\n"
"\n"
"Equivalent to:\n"
" def count(firstval=0, step=1):\n"
" x = firstval\n"
" while 1:\n"
" yield x\n"
" x += step");
static PyObject *
itertools_count_impl(PyTypeObject *type, PyObject *long_cnt,
PyObject *long_step);
static PyObject *
itertools_count(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
PyObject *return_value = NULL;
static const char * const _keywords[] = {"start", "step", NULL};
static _PyArg_Parser _parser = {"|OO:count", _keywords, 0};
PyObject *long_cnt = NULL;
PyObject *long_step = NULL;
if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser,
&long_cnt, &long_step)) {
goto exit;
}
return_value = itertools_count_impl(type, long_cnt, long_step);
exit:
return return_value;
}
/*[clinic end generated code: output=d9eb9601bd3296ef input=a9049054013a1b77]*/

View File

@ -11,11 +11,39 @@
module itertools module itertools
class itertools.groupby "groupbyobject *" "&groupby_type" class itertools.groupby "groupbyobject *" "&groupby_type"
class itertools._grouper "_grouperobject *" "&_grouper_type" class itertools._grouper "_grouperobject *" "&_grouper_type"
class itertools.teedataobject "teedataobject *" "&teedataobject_type"
class itertools._tee "teeobject *" "&tee_type"
class itertools.cycle "cycleobject *" "&cycle_type"
class itertools.dropwhile "dropwhileobject *" "&dropwhile_type"
class itertools.takewhile "takewhileobject *" "&takewhile_type"
class itertools.starmap "starmapobject *" "&starmap_type"
class itertools.chain "chainobject *" "&chain_type"
class itertools.combinations "combinationsobject *" "&combinations_type"
class itertools.combinations_with_replacement "cwr_object *" "&cwr_type"
class itertools.permutations "permutationsobject *" "&permutations_type"
class itertools.accumulate "accumulateobject *" "&accumulate_type"
class itertools.compress "compressobject *" "&compress_type"
class itertools.filterfalse "filterfalseobject *" "&filterfalse_type"
class itertools.count "countobject *" "&count_type"
[clinic start generated code]*/ [clinic start generated code]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=9d506f5bb9177570]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=ea05c93c6d94726a]*/
static PyTypeObject groupby_type; static PyTypeObject groupby_type;
static PyTypeObject _grouper_type; static PyTypeObject _grouper_type;
static PyTypeObject teedataobject_type;
static PyTypeObject tee_type;
static PyTypeObject cycle_type;
static PyTypeObject dropwhile_type;
static PyTypeObject takewhile_type;
static PyTypeObject starmap_type;
static PyTypeObject combinations_type;
static PyTypeObject cwr_type;
static PyTypeObject permutations_type;
static PyTypeObject accumulate_type;
static PyTypeObject compress_type;
static PyTypeObject filterfalse_type;
static PyTypeObject count_type;
#include "clinic/itertoolsmodule.c.h" #include "clinic/itertoolsmodule.c.h"
@ -539,18 +567,25 @@ teedataobject_reduce(teedataobject *tdo, PyObject *Py_UNUSED(ignored))
tdo->nextlink ? tdo->nextlink : Py_None); tdo->nextlink ? tdo->nextlink : Py_None);
} }
static PyTypeObject teedataobject_type; /*[clinic input]
@classmethod
itertools.teedataobject.__new__
iterable as it: object
values: object(subclass_of='&PyList_Type')
next: object
/
Data container common to multiple tee objects.
[clinic start generated code]*/
static PyObject * static PyObject *
teedataobject_new(PyTypeObject *type, PyObject *args, PyObject *kw) itertools_teedataobject_impl(PyTypeObject *type, PyObject *it,
PyObject *values, PyObject *next)
/*[clinic end generated code: output=3343ceb07e08df5e input=be60f2fabd2b72ba]*/
{ {
teedataobject *tdo; teedataobject *tdo;
PyObject *it, *values, *next;
Py_ssize_t i, len; Py_ssize_t i, len;
assert(type == &teedataobject_type); assert(type == &teedataobject_type);
if (!PyArg_ParseTuple(args, "OO!O", &it, &PyList_Type, &values, &next))
return NULL;
tdo = (teedataobject *)teedataobject_newinternal(it); tdo = (teedataobject *)teedataobject_newinternal(it);
if (!tdo) if (!tdo)
@ -592,8 +627,6 @@ static PyMethodDef teedataobject_methods[] = {
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };
PyDoc_STRVAR(teedataobject_doc, "Data container common to multiple tee objects.");
static PyTypeObject teedataobject_type = { static PyTypeObject teedataobject_type = {
PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */ PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
"itertools._tee_dataobject", /* tp_name */ "itertools._tee_dataobject", /* tp_name */
@ -616,7 +649,7 @@ static PyTypeObject teedataobject_type = {
0, /* tp_setattro */ 0, /* tp_setattro */
0, /* tp_as_buffer */ 0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
teedataobject_doc, /* tp_doc */ itertools_teedataobject__doc__, /* tp_doc */
(traverseproc)teedataobject_traverse, /* tp_traverse */ (traverseproc)teedataobject_traverse, /* tp_traverse */
(inquiry)teedataobject_clear, /* tp_clear */ (inquiry)teedataobject_clear, /* tp_clear */
0, /* tp_richcompare */ 0, /* tp_richcompare */
@ -633,7 +666,7 @@ static PyTypeObject teedataobject_type = {
0, /* tp_dictoffset */ 0, /* tp_dictoffset */
0, /* tp_init */ 0, /* tp_init */
0, /* tp_alloc */ 0, /* tp_alloc */
teedataobject_new, /* tp_new */ itertools_teedataobject, /* tp_new */
PyObject_GC_Del, /* tp_free */ PyObject_GC_Del, /* tp_free */
}; };
@ -716,13 +749,18 @@ done:
return (PyObject *)to; return (PyObject *)to;
} }
static PyObject * /*[clinic input]
tee_new(PyTypeObject *type, PyObject *args, PyObject *kw) @classmethod
{ itertools._tee.__new__
PyObject *iterable; iterable: object
/
Iterator wrapped to make it copyable.
[clinic start generated code]*/
if (!PyArg_UnpackTuple(args, "_tee", 1, 1, &iterable)) static PyObject *
return NULL; itertools__tee_impl(PyTypeObject *type, PyObject *iterable)
/*[clinic end generated code: output=b02d3fd26c810c3f input=adc0779d2afe37a2]*/
{
return tee_fromiterable(iterable); return tee_fromiterable(iterable);
} }
@ -771,9 +809,6 @@ tee_setstate(teeobject *to, PyObject *state)
Py_RETURN_NONE; Py_RETURN_NONE;
} }
PyDoc_STRVAR(teeobject_doc,
"Iterator wrapped to make it copyable");
static PyMethodDef tee_methods[] = { static PyMethodDef tee_methods[] = {
{"__copy__", (PyCFunction)tee_copy, METH_NOARGS, teecopy_doc}, {"__copy__", (PyCFunction)tee_copy, METH_NOARGS, teecopy_doc},
{"__reduce__", (PyCFunction)tee_reduce, METH_NOARGS, reduce_doc}, {"__reduce__", (PyCFunction)tee_reduce, METH_NOARGS, reduce_doc},
@ -803,7 +838,7 @@ static PyTypeObject tee_type = {
0, /* tp_setattro */ 0, /* tp_setattro */
0, /* tp_as_buffer */ 0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
teeobject_doc, /* tp_doc */ itertools__tee__doc__, /* tp_doc */
(traverseproc)tee_traverse, /* tp_traverse */ (traverseproc)tee_traverse, /* tp_traverse */
(inquiry)tee_clear, /* tp_clear */ (inquiry)tee_clear, /* tp_clear */
0, /* tp_richcompare */ 0, /* tp_richcompare */
@ -820,19 +855,26 @@ static PyTypeObject tee_type = {
0, /* tp_dictoffset */ 0, /* tp_dictoffset */
0, /* tp_init */ 0, /* tp_init */
0, /* tp_alloc */ 0, /* tp_alloc */
tee_new, /* tp_new */ itertools__tee, /* tp_new */
PyObject_GC_Del, /* tp_free */ PyObject_GC_Del, /* tp_free */
}; };
/*[clinic input]
itertools.tee
iterable: object
n: Py_ssize_t = 2
/
Returns a tuple of n independent iterators.
[clinic start generated code]*/
static PyObject * static PyObject *
tee(PyObject *self, PyObject *args) itertools_tee_impl(PyObject *module, PyObject *iterable, Py_ssize_t n)
/*[clinic end generated code: output=1c64519cd859c2f0 input=c99a1472c425d66d]*/
{ {
Py_ssize_t i, n=2; Py_ssize_t i;
PyObject *it, *iterable, *copyable, *copyfunc, *result; PyObject *it, *copyable, *copyfunc, *result;
_Py_IDENTIFIER(__copy__); _Py_IDENTIFIER(__copy__);
if (!PyArg_ParseTuple(args, "O|n", &iterable, &n))
return NULL;
if (n < 0) { if (n < 0) {
PyErr_SetString(PyExc_ValueError, "n must be >= 0"); PyErr_SetString(PyExc_ValueError, "n must be >= 0");
return NULL; return NULL;
@ -885,9 +927,6 @@ tee(PyObject *self, PyObject *args)
return result; return result;
} }
PyDoc_STRVAR(tee_doc,
"tee(iterable, n=2) --> tuple of n independent iterators.");
/* cycle object **************************************************************/ /* cycle object **************************************************************/
@ -901,20 +940,22 @@ typedef struct {
static PyTypeObject cycle_type; static PyTypeObject cycle_type;
/*[clinic input]
@classmethod
itertools.cycle.__new__
iterable: object
/
Return elements from the iterable until it is exhausted. Then repeat the sequence indefinitely.
[clinic start generated code]*/
static PyObject * static PyObject *
cycle_new(PyTypeObject *type, PyObject *args, PyObject *kwds) itertools_cycle_impl(PyTypeObject *type, PyObject *iterable)
/*[clinic end generated code: output=f60e5ec17a45b35c input=9d1d84bcf66e908b]*/
{ {
PyObject *it; PyObject *it;
PyObject *iterable;
PyObject *saved; PyObject *saved;
cycleobject *lz; cycleobject *lz;
if (type == &cycle_type && !_PyArg_NoKeywords("cycle", kwds))
return NULL;
if (!PyArg_UnpackTuple(args, "cycle", 1, 1, &iterable))
return NULL;
/* Get iterator. */ /* Get iterator. */
it = PyObject_GetIter(iterable); it = PyObject_GetIter(iterable);
if (it == NULL) if (it == NULL)
@ -1041,12 +1082,6 @@ static PyMethodDef cycle_methods[] = {
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };
PyDoc_STRVAR(cycle_doc,
"cycle(iterable) --> cycle object\n\
\n\
Return elements from the iterable until it is exhausted.\n\
Then repeat the sequence indefinitely.");
static PyTypeObject cycle_type = { static PyTypeObject cycle_type = {
PyVarObject_HEAD_INIT(NULL, 0) PyVarObject_HEAD_INIT(NULL, 0)
"itertools.cycle", /* tp_name */ "itertools.cycle", /* tp_name */
@ -1070,7 +1105,7 @@ static PyTypeObject cycle_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 */
cycle_doc, /* tp_doc */ itertools_cycle__doc__, /* tp_doc */
(traverseproc)cycle_traverse, /* tp_traverse */ (traverseproc)cycle_traverse, /* tp_traverse */
0, /* tp_clear */ 0, /* tp_clear */
0, /* tp_richcompare */ 0, /* tp_richcompare */
@ -1087,7 +1122,7 @@ static PyTypeObject cycle_type = {
0, /* tp_dictoffset */ 0, /* tp_dictoffset */
0, /* tp_init */ 0, /* tp_init */
0, /* tp_alloc */ 0, /* tp_alloc */
cycle_new, /* tp_new */ itertools_cycle, /* tp_new */
PyObject_GC_Del, /* tp_free */ PyObject_GC_Del, /* tp_free */
}; };
@ -1103,19 +1138,24 @@ typedef struct {
static PyTypeObject dropwhile_type; static PyTypeObject dropwhile_type;
/*[clinic input]
@classmethod
itertools.dropwhile.__new__
predicate as func: object
iterable as seq: object
/
Drop items from the iterable while predicate(item) is true.
Afterwards, return every element until the iterable is exhausted.
[clinic start generated code]*/
static PyObject * static PyObject *
dropwhile_new(PyTypeObject *type, PyObject *args, PyObject *kwds) itertools_dropwhile_impl(PyTypeObject *type, PyObject *func, PyObject *seq)
/*[clinic end generated code: output=92f9d0d89af149e4 input=d39737147c9f0a26]*/
{ {
PyObject *func, *seq;
PyObject *it; PyObject *it;
dropwhileobject *lz; dropwhileobject *lz;
if (type == &dropwhile_type && !_PyArg_NoKeywords("dropwhile", kwds))
return NULL;
if (!PyArg_UnpackTuple(args, "dropwhile", 2, 2, &func, &seq))
return NULL;
/* Get iterator. */ /* Get iterator. */
it = PyObject_GetIter(seq); it = PyObject_GetIter(seq);
if (it == NULL) if (it == NULL)
@ -1209,12 +1249,6 @@ static PyMethodDef dropwhile_methods[] = {
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };
PyDoc_STRVAR(dropwhile_doc,
"dropwhile(predicate, iterable) --> dropwhile object\n\
\n\
Drop items from the iterable while predicate(item) is true.\n\
Afterwards, return every element until the iterable is exhausted.");
static PyTypeObject dropwhile_type = { static PyTypeObject dropwhile_type = {
PyVarObject_HEAD_INIT(NULL, 0) PyVarObject_HEAD_INIT(NULL, 0)
"itertools.dropwhile", /* tp_name */ "itertools.dropwhile", /* tp_name */
@ -1238,7 +1272,7 @@ static PyTypeObject dropwhile_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 */
dropwhile_doc, /* tp_doc */ itertools_dropwhile__doc__, /* tp_doc */
(traverseproc)dropwhile_traverse, /* tp_traverse */ (traverseproc)dropwhile_traverse, /* tp_traverse */
0, /* tp_clear */ 0, /* tp_clear */
0, /* tp_richcompare */ 0, /* tp_richcompare */
@ -1255,7 +1289,7 @@ static PyTypeObject dropwhile_type = {
0, /* tp_dictoffset */ 0, /* tp_dictoffset */
0, /* tp_init */ 0, /* tp_init */
0, /* tp_alloc */ 0, /* tp_alloc */
dropwhile_new, /* tp_new */ itertools_dropwhile, /* tp_new */
PyObject_GC_Del, /* tp_free */ PyObject_GC_Del, /* tp_free */
}; };
@ -1271,19 +1305,22 @@ typedef struct {
static PyTypeObject takewhile_type; static PyTypeObject takewhile_type;
/*[clinic input]
@classmethod
itertools.takewhile.__new__
predicate as func: object
iterable as seq: object
/
Return successive entries from an iterable as long as the predicate evaluates to true for each entry.
[clinic start generated code]*/
static PyObject * static PyObject *
takewhile_new(PyTypeObject *type, PyObject *args, PyObject *kwds) itertools_takewhile_impl(PyTypeObject *type, PyObject *func, PyObject *seq)
/*[clinic end generated code: output=bb179ea7864e2ef6 input=ba5255f7519aa119]*/
{ {
PyObject *func, *seq;
PyObject *it; PyObject *it;
takewhileobject *lz; takewhileobject *lz;
if (type == &takewhile_type && !_PyArg_NoKeywords("takewhile", kwds))
return NULL;
if (!PyArg_UnpackTuple(args, "takewhile", 2, 2, &func, &seq))
return NULL;
/* Get iterator. */ /* Get iterator. */
it = PyObject_GetIter(seq); it = PyObject_GetIter(seq);
if (it == NULL) if (it == NULL)
@ -1373,11 +1410,6 @@ static PyMethodDef takewhile_reduce_methods[] = {
setstate_doc}, setstate_doc},
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };
PyDoc_STRVAR(takewhile_doc,
"takewhile(predicate, iterable) --> takewhile object\n\
\n\
Return successive entries from an iterable as long as the\n\
predicate evaluates to true for each entry.");
static PyTypeObject takewhile_type = { static PyTypeObject takewhile_type = {
PyVarObject_HEAD_INIT(NULL, 0) PyVarObject_HEAD_INIT(NULL, 0)
@ -1402,7 +1434,7 @@ static PyTypeObject takewhile_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 */
takewhile_doc, /* tp_doc */ itertools_takewhile__doc__, /* tp_doc */
(traverseproc)takewhile_traverse, /* tp_traverse */ (traverseproc)takewhile_traverse, /* tp_traverse */
0, /* tp_clear */ 0, /* tp_clear */
0, /* tp_richcompare */ 0, /* tp_richcompare */
@ -1419,7 +1451,7 @@ static PyTypeObject takewhile_type = {
0, /* tp_dictoffset */ 0, /* tp_dictoffset */
0, /* tp_init */ 0, /* tp_init */
0, /* tp_alloc */ 0, /* tp_alloc */
takewhile_new, /* tp_new */ itertools_takewhile, /* tp_new */
PyObject_GC_Del, /* tp_free */ PyObject_GC_Del, /* tp_free */
}; };
@ -1693,19 +1725,22 @@ typedef struct {
static PyTypeObject starmap_type; static PyTypeObject starmap_type;
/*[clinic input]
@classmethod
itertools.starmap.__new__
function as func: object
iterable as seq: object
/
Return an iterator whose values are returned from the function evaluated with an argument tuple taken from the given sequence.
[clinic start generated code]*/
static PyObject * static PyObject *
starmap_new(PyTypeObject *type, PyObject *args, PyObject *kwds) itertools_starmap_impl(PyTypeObject *type, PyObject *func, PyObject *seq)
/*[clinic end generated code: output=79eeb81d452c6e8d input=844766df6a0d4dad]*/
{ {
PyObject *func, *seq;
PyObject *it; PyObject *it;
starmapobject *lz; starmapobject *lz;
if (type == &starmap_type && !_PyArg_NoKeywords("starmap", kwds))
return NULL;
if (!PyArg_UnpackTuple(args, "starmap", 2, 2, &func, &seq))
return NULL;
/* Get iterator. */ /* Get iterator. */
it = PyObject_GetIter(seq); it = PyObject_GetIter(seq);
if (it == NULL) if (it == NULL)
@ -1776,12 +1811,6 @@ static PyMethodDef starmap_methods[] = {
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };
PyDoc_STRVAR(starmap_doc,
"starmap(function, sequence) --> starmap object\n\
\n\
Return an iterator whose values are returned from the function evaluated\n\
with an argument tuple taken from the given sequence.");
static PyTypeObject starmap_type = { static PyTypeObject starmap_type = {
PyVarObject_HEAD_INIT(NULL, 0) PyVarObject_HEAD_INIT(NULL, 0)
"itertools.starmap", /* tp_name */ "itertools.starmap", /* tp_name */
@ -1805,7 +1834,7 @@ static PyTypeObject starmap_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 */
starmap_doc, /* tp_doc */ itertools_starmap__doc__, /* tp_doc */
(traverseproc)starmap_traverse, /* tp_traverse */ (traverseproc)starmap_traverse, /* tp_traverse */
0, /* tp_clear */ 0, /* tp_clear */
0, /* tp_richcompare */ 0, /* tp_richcompare */
@ -1822,7 +1851,7 @@ static PyTypeObject starmap_type = {
0, /* tp_dictoffset */ 0, /* tp_dictoffset */
0, /* tp_init */ 0, /* tp_init */
0, /* tp_alloc */ 0, /* tp_alloc */
starmap_new, /* tp_new */ itertools_starmap, /* tp_new */
PyObject_GC_Del, /* tp_free */ PyObject_GC_Del, /* tp_free */
}; };
@ -1868,8 +1897,17 @@ chain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return chain_new_internal(type, source); return chain_new_internal(type, source);
} }
/*[clinic input]
@classmethod
itertools.chain.from_iterable
iterable as arg: object
/
Alternative chain() constructor taking a single iterable argument that evaluates lazily.
[clinic start generated code]*/
static PyObject * static PyObject *
chain_new_from_iterable(PyTypeObject *type, PyObject *arg) itertools_chain_from_iterable(PyTypeObject *type, PyObject *arg)
/*[clinic end generated code: output=667ae7a7f7b68654 input=72c39e3a2ca3be85]*/
{ {
PyObject *source; PyObject *source;
@ -1985,15 +2023,8 @@ Return a chain object whose .__next__() method returns elements from the\n\
first iterable until it is exhausted, then elements from the next\n\ first iterable until it is exhausted, then elements from the next\n\
iterable, until all of the iterables are exhausted."); iterable, until all of the iterables are exhausted.");
PyDoc_STRVAR(chain_from_iterable_doc,
"chain.from_iterable(iterable) --> chain object\n\
\n\
Alternate chain() constructor taking a single iterable argument\n\
that evaluates lazily.");
static PyMethodDef chain_methods[] = { static PyMethodDef chain_methods[] = {
{"from_iterable", (PyCFunction) chain_new_from_iterable, METH_O | METH_CLASS, ITERTOOLS_CHAIN_FROM_ITERABLE_METHODDEF
chain_from_iterable_doc},
{"__reduce__", (PyCFunction)chain_reduce, METH_NOARGS, {"__reduce__", (PyCFunction)chain_reduce, METH_NOARGS,
reduce_doc}, reduce_doc},
{"__setstate__", (PyCFunction)chain_setstate, METH_O, {"__setstate__", (PyCFunction)chain_setstate, METH_O,
@ -2417,21 +2448,27 @@ typedef struct {
static PyTypeObject combinations_type; static PyTypeObject combinations_type;
/*[clinic input]
@classmethod
itertools.combinations.__new__
iterable: object
r: Py_ssize_t
Return successive r-length combinations of elements in the iterable.
combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)
[clinic start generated code]*/
static PyObject * static PyObject *
combinations_new(PyTypeObject *type, PyObject *args, PyObject *kwds) itertools_combinations_impl(PyTypeObject *type, PyObject *iterable,
Py_ssize_t r)
/*[clinic end generated code: output=87a689b39c40039c input=06bede09e3da20f8]*/
{ {
combinationsobject *co; combinationsobject *co;
Py_ssize_t n; Py_ssize_t n;
Py_ssize_t r;
PyObject *pool = NULL; PyObject *pool = NULL;
PyObject *iterable = NULL;
Py_ssize_t *indices = NULL; Py_ssize_t *indices = NULL;
Py_ssize_t i; Py_ssize_t i;
static char *kwargs[] = {"iterable", "r", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "On:combinations", kwargs,
&iterable, &r))
return NULL;
pool = PySequence_Tuple(iterable); pool = PySequence_Tuple(iterable);
if (pool == NULL) if (pool == NULL)
@ -2666,12 +2703,6 @@ static PyMethodDef combinations_methods[] = {
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };
PyDoc_STRVAR(combinations_doc,
"combinations(iterable, r) --> combinations object\n\
\n\
Return successive r-length combinations of elements in the iterable.\n\n\
combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)");
static PyTypeObject combinations_type = { static PyTypeObject combinations_type = {
PyVarObject_HEAD_INIT(NULL, 0) PyVarObject_HEAD_INIT(NULL, 0)
"itertools.combinations", /* tp_name */ "itertools.combinations", /* tp_name */
@ -2695,7 +2726,7 @@ static PyTypeObject combinations_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 */
combinations_doc, /* tp_doc */ itertools_combinations__doc__, /* tp_doc */
(traverseproc)combinations_traverse,/* tp_traverse */ (traverseproc)combinations_traverse,/* tp_traverse */
0, /* tp_clear */ 0, /* tp_clear */
0, /* tp_richcompare */ 0, /* tp_richcompare */
@ -2712,7 +2743,7 @@ static PyTypeObject combinations_type = {
0, /* tp_dictoffset */ 0, /* tp_dictoffset */
0, /* tp_init */ 0, /* tp_init */
0, /* tp_alloc */ 0, /* tp_alloc */
combinations_new, /* tp_new */ itertools_combinations, /* tp_new */
PyObject_GC_Del, /* tp_free */ PyObject_GC_Del, /* tp_free */
}; };
@ -2756,22 +2787,27 @@ typedef struct {
static PyTypeObject cwr_type; static PyTypeObject cwr_type;
/*[clinic input]
@classmethod
itertools.combinations_with_replacement.__new__
iterable: object
r: Py_ssize_t
Return successive r-length combinations of elements in the iterable allowing individual elements to have successive repeats.
combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC"
[clinic start generated code]*/
static PyObject * static PyObject *
cwr_new(PyTypeObject *type, PyObject *args, PyObject *kwds) itertools_combinations_with_replacement_impl(PyTypeObject *type,
PyObject *iterable,
Py_ssize_t r)
/*[clinic end generated code: output=48b26856d4e659ca input=dc2a8c7ba785fad7]*/
{ {
cwrobject *co; cwrobject *co;
Py_ssize_t n; Py_ssize_t n;
Py_ssize_t r;
PyObject *pool = NULL; PyObject *pool = NULL;
PyObject *iterable = NULL;
Py_ssize_t *indices = NULL; Py_ssize_t *indices = NULL;
Py_ssize_t i; Py_ssize_t i;
static char *kwargs[] = {"iterable", "r", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwds,
"On:combinations_with_replacement",
kwargs, &iterable, &r))
return NULL;
pool = PySequence_Tuple(iterable); pool = PySequence_Tuple(iterable);
if (pool == NULL) if (pool == NULL)
@ -2996,13 +3032,6 @@ static PyMethodDef cwr_methods[] = {
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };
PyDoc_STRVAR(cwr_doc,
"combinations_with_replacement(iterable, r) --> combinations_with_replacement object\n\
\n\
Return successive r-length combinations of elements in the iterable\n\
allowing individual elements to have successive repeats.\n\
combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC");
static PyTypeObject cwr_type = { static PyTypeObject cwr_type = {
PyVarObject_HEAD_INIT(NULL, 0) PyVarObject_HEAD_INIT(NULL, 0)
"itertools.combinations_with_replacement", /* tp_name */ "itertools.combinations_with_replacement", /* tp_name */
@ -3026,7 +3055,7 @@ static PyTypeObject cwr_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 */
cwr_doc, /* tp_doc */ itertools_combinations_with_replacement__doc__, /* tp_doc */
(traverseproc)cwr_traverse, /* tp_traverse */ (traverseproc)cwr_traverse, /* tp_traverse */
0, /* tp_clear */ 0, /* tp_clear */
0, /* tp_richcompare */ 0, /* tp_richcompare */
@ -3043,7 +3072,7 @@ static PyTypeObject cwr_type = {
0, /* tp_dictoffset */ 0, /* tp_dictoffset */
0, /* tp_init */ 0, /* tp_init */
0, /* tp_alloc */ 0, /* tp_alloc */
cwr_new, /* tp_new */ itertools_combinations_with_replacement, /* tp_new */
PyObject_GC_Del, /* tp_free */ PyObject_GC_Del, /* tp_free */
}; };
@ -3085,23 +3114,28 @@ typedef struct {
static PyTypeObject permutations_type; static PyTypeObject permutations_type;
/*[clinic input]
@classmethod
itertools.permutations.__new__
iterable: object
r as robj: object = None
Return successive r-length permutations of elements in the iterable.
permutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)
[clinic start generated code]*/
static PyObject * static PyObject *
permutations_new(PyTypeObject *type, PyObject *args, PyObject *kwds) itertools_permutations_impl(PyTypeObject *type, PyObject *iterable,
PyObject *robj)
/*[clinic end generated code: output=296a72fa76d620ea input=57d0170a4ac0ec7a]*/
{ {
permutationsobject *po; permutationsobject *po;
Py_ssize_t n; Py_ssize_t n;
Py_ssize_t r; Py_ssize_t r;
PyObject *robj = Py_None;
PyObject *pool = NULL; PyObject *pool = NULL;
PyObject *iterable = NULL;
Py_ssize_t *indices = NULL; Py_ssize_t *indices = NULL;
Py_ssize_t *cycles = NULL; Py_ssize_t *cycles = NULL;
Py_ssize_t i; Py_ssize_t i;
static char *kwargs[] = {"iterable", "r", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:permutations", kwargs,
&iterable, &robj))
return NULL;
pool = PySequence_Tuple(iterable); pool = PySequence_Tuple(iterable);
if (pool == NULL) if (pool == NULL)
@ -3389,12 +3423,6 @@ static PyMethodDef permuations_methods[] = {
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };
PyDoc_STRVAR(permutations_doc,
"permutations(iterable[, r]) --> permutations object\n\
\n\
Return successive r-length permutations of elements in the iterable.\n\n\
permutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)");
static PyTypeObject permutations_type = { static PyTypeObject permutations_type = {
PyVarObject_HEAD_INIT(NULL, 0) PyVarObject_HEAD_INIT(NULL, 0)
"itertools.permutations", /* tp_name */ "itertools.permutations", /* tp_name */
@ -3418,7 +3446,7 @@ static PyTypeObject permutations_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 */
permutations_doc, /* tp_doc */ itertools_permutations__doc__, /* tp_doc */
(traverseproc)permutations_traverse,/* tp_traverse */ (traverseproc)permutations_traverse,/* tp_traverse */
0, /* tp_clear */ 0, /* tp_clear */
0, /* tp_richcompare */ 0, /* tp_richcompare */
@ -3435,10 +3463,11 @@ static PyTypeObject permutations_type = {
0, /* tp_dictoffset */ 0, /* tp_dictoffset */
0, /* tp_init */ 0, /* tp_init */
0, /* tp_alloc */ 0, /* tp_alloc */
permutations_new, /* tp_new */ itertools_permutations, /* tp_new */
PyObject_GC_Del, /* tp_free */ PyObject_GC_Del, /* tp_free */
}; };
/* accumulate object ********************************************************/ /* accumulate object ********************************************************/
typedef struct { typedef struct {
@ -3450,18 +3479,22 @@ typedef struct {
static PyTypeObject accumulate_type; static PyTypeObject accumulate_type;
/*[clinic input]
@classmethod
itertools.accumulate.__new__
iterable: object
func as binop: object = None
Return series of accumulated sums (or other binary function results).
[clinic start generated code]*/
static PyObject * static PyObject *
accumulate_new(PyTypeObject *type, PyObject *args, PyObject *kwds) itertools_accumulate_impl(PyTypeObject *type, PyObject *iterable,
PyObject *binop)
/*[clinic end generated code: output=514d0fb30ba14d55 input=6d9d16aaa1d3cbfc]*/
{ {
static char *kwargs[] = {"iterable", "func", NULL};
PyObject *iterable;
PyObject *it; PyObject *it;
PyObject *binop = Py_None;
accumulateobject *lz; accumulateobject *lz;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:accumulate",
kwargs, &iterable, &binop))
return NULL;
/* Get iterator. */ /* Get iterator. */
it = PyObject_GetIter(iterable); it = PyObject_GetIter(iterable);
@ -3572,11 +3605,6 @@ static PyMethodDef accumulate_methods[] = {
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };
PyDoc_STRVAR(accumulate_doc,
"accumulate(iterable[, func]) --> accumulate object\n\
\n\
Return series of accumulated sums (or other binary function results).");
static PyTypeObject accumulate_type = { static PyTypeObject accumulate_type = {
PyVarObject_HEAD_INIT(NULL, 0) PyVarObject_HEAD_INIT(NULL, 0)
"itertools.accumulate", /* tp_name */ "itertools.accumulate", /* tp_name */
@ -3600,7 +3628,7 @@ static PyTypeObject accumulate_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 */
accumulate_doc, /* tp_doc */ itertools_accumulate__doc__, /* tp_doc */
(traverseproc)accumulate_traverse, /* tp_traverse */ (traverseproc)accumulate_traverse, /* tp_traverse */
0, /* tp_clear */ 0, /* tp_clear */
0, /* tp_richcompare */ 0, /* tp_richcompare */
@ -3617,7 +3645,7 @@ static PyTypeObject accumulate_type = {
0, /* tp_dictoffset */ 0, /* tp_dictoffset */
0, /* tp_init */ 0, /* tp_init */
0, /* tp_alloc */ 0, /* tp_alloc */
accumulate_new, /* tp_new */ itertools_accumulate, /* tp_new */
PyObject_GC_Del, /* tp_free */ PyObject_GC_Del, /* tp_free */
}; };
@ -3639,16 +3667,23 @@ typedef struct {
static PyTypeObject compress_type; static PyTypeObject compress_type;
/*[clinic input]
@classmethod
itertools.compress.__new__
data as seq1: object
selectors as seq2: object
Return data elements corresponding to true selector elements.
Forms a shorter iterator from selected data elements using the selectors to
choose the data elements.
[clinic start generated code]*/
static PyObject * static PyObject *
compress_new(PyTypeObject *type, PyObject *args, PyObject *kwds) itertools_compress_impl(PyTypeObject *type, PyObject *seq1, PyObject *seq2)
/*[clinic end generated code: output=7e67157212ed09e0 input=79596d7cd20c77e5]*/
{ {
PyObject *seq1, *seq2;
PyObject *data=NULL, *selectors=NULL; PyObject *data=NULL, *selectors=NULL;
compressobject *lz; compressobject *lz;
static char *kwargs[] = {"data", "selectors", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO:compress", kwargs, &seq1, &seq2))
return NULL;
data = PyObject_GetIter(seq1); data = PyObject_GetIter(seq1);
if (data == NULL) if (data == NULL)
@ -3737,13 +3772,6 @@ static PyMethodDef compress_methods[] = {
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };
PyDoc_STRVAR(compress_doc,
"compress(data, selectors) --> iterator over selected data\n\
\n\
Return data elements corresponding to true selector elements.\n\
Forms a shorter iterator from selected data elements using the\n\
selectors to choose the data elements.");
static PyTypeObject compress_type = { static PyTypeObject compress_type = {
PyVarObject_HEAD_INIT(NULL, 0) PyVarObject_HEAD_INIT(NULL, 0)
"itertools.compress", /* tp_name */ "itertools.compress", /* tp_name */
@ -3767,7 +3795,7 @@ static PyTypeObject compress_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 */
compress_doc, /* tp_doc */ itertools_compress__doc__, /* tp_doc */
(traverseproc)compress_traverse, /* tp_traverse */ (traverseproc)compress_traverse, /* tp_traverse */
0, /* tp_clear */ 0, /* tp_clear */
0, /* tp_richcompare */ 0, /* tp_richcompare */
@ -3784,7 +3812,7 @@ static PyTypeObject compress_type = {
0, /* tp_dictoffset */ 0, /* tp_dictoffset */
0, /* tp_init */ 0, /* tp_init */
0, /* tp_alloc */ 0, /* tp_alloc */
compress_new, /* tp_new */ itertools_compress, /* tp_new */
PyObject_GC_Del, /* tp_free */ PyObject_GC_Del, /* tp_free */
}; };
@ -3799,20 +3827,24 @@ typedef struct {
static PyTypeObject filterfalse_type; static PyTypeObject filterfalse_type;
/*[clinic input]
@classmethod
itertools.filterfalse.__new__
function as func: object
iterable as seq: object
/
Return those items of iterable for which function(item) is false.
If function is None, return the items that are false.
[clinic start generated code]*/
static PyObject * static PyObject *
filterfalse_new(PyTypeObject *type, PyObject *args, PyObject *kwds) itertools_filterfalse_impl(PyTypeObject *type, PyObject *func, PyObject *seq)
/*[clinic end generated code: output=55f87eab9fc0484e input=2d684a2c66f99cde]*/
{ {
PyObject *func, *seq;
PyObject *it; PyObject *it;
filterfalseobject *lz; filterfalseobject *lz;
if (type == &filterfalse_type &&
!_PyArg_NoKeywords("filterfalse", kwds))
return NULL;
if (!PyArg_UnpackTuple(args, "filterfalse", 2, 2, &func, &seq))
return NULL;
/* Get iterator. */ /* Get iterator. */
it = PyObject_GetIter(seq); it = PyObject_GetIter(seq);
if (it == NULL) if (it == NULL)
@ -3894,12 +3926,6 @@ static PyMethodDef filterfalse_methods[] = {
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };
PyDoc_STRVAR(filterfalse_doc,
"filterfalse(function or None, sequence) --> filterfalse object\n\
\n\
Return those items of sequence for which function(item) is false.\n\
If function is None, return the items that are false.");
static PyTypeObject filterfalse_type = { static PyTypeObject filterfalse_type = {
PyVarObject_HEAD_INIT(NULL, 0) PyVarObject_HEAD_INIT(NULL, 0)
"itertools.filterfalse", /* tp_name */ "itertools.filterfalse", /* tp_name */
@ -3923,7 +3949,7 @@ static PyTypeObject filterfalse_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 */
filterfalse_doc, /* tp_doc */ itertools_filterfalse__doc__, /* tp_doc */
(traverseproc)filterfalse_traverse, /* tp_traverse */ (traverseproc)filterfalse_traverse, /* tp_traverse */
0, /* tp_clear */ 0, /* tp_clear */
0, /* tp_richcompare */ 0, /* tp_richcompare */
@ -3940,7 +3966,7 @@ static PyTypeObject filterfalse_type = {
0, /* tp_dictoffset */ 0, /* tp_dictoffset */
0, /* tp_init */ 0, /* tp_init */
0, /* tp_alloc */ 0, /* tp_alloc */
filterfalse_new, /* tp_new */ itertools_filterfalse, /* tp_new */
PyObject_GC_Del, /* tp_free */ PyObject_GC_Del, /* tp_free */
}; };
@ -3973,20 +3999,30 @@ slow_mode: when cnt == PY_SSIZE_T_MAX, step is not int(1), or cnt is a float.
static PyTypeObject count_type; static PyTypeObject count_type;
/*[clinic input]
@classmethod
itertools.count.__new__
start as long_cnt: object(c_default="NULL") = 0
step as long_step: object(c_default="NULL") = 1
Return a count object whose .__next__() method returns consecutive values.
Equivalent to:
def count(firstval=0, step=1):
x = firstval
while 1:
yield x
x += step
[clinic start generated code]*/
static PyObject * static PyObject *
count_new(PyTypeObject *type, PyObject *args, PyObject *kwds) itertools_count_impl(PyTypeObject *type, PyObject *long_cnt,
PyObject *long_step)
/*[clinic end generated code: output=09a9250aebd00b1c input=d7a85eec18bfcd94]*/
{ {
countobject *lz; countobject *lz;
int fast_mode; int fast_mode;
Py_ssize_t cnt = 0; Py_ssize_t cnt = 0;
PyObject *long_cnt = NULL;
PyObject *long_step = NULL;
long step; long step;
static char *kwlist[] = {"start", "step", 0};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:count",
kwlist, &long_cnt, &long_step))
return NULL;
if ((long_cnt != NULL && !PyNumber_Check(long_cnt)) || if ((long_cnt != NULL && !PyNumber_Check(long_cnt)) ||
(long_step != NULL && !PyNumber_Check(long_step))) { (long_step != NULL && !PyNumber_Check(long_step))) {
@ -4139,17 +4175,6 @@ static PyMethodDef count_methods[] = {
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };
PyDoc_STRVAR(count_doc,
"count(start=0, step=1) --> count object\n\
\n\
Return a count object whose .__next__() method returns consecutive values.\n\
Equivalent to:\n\n\
def count(firstval=0, step=1):\n\
x = firstval\n\
while 1:\n\
yield x\n\
x += step\n");
static PyTypeObject count_type = { static PyTypeObject count_type = {
PyVarObject_HEAD_INIT(NULL, 0) PyVarObject_HEAD_INIT(NULL, 0)
"itertools.count", /* tp_name */ "itertools.count", /* tp_name */
@ -4173,7 +4198,7 @@ static PyTypeObject count_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 */
count_doc, /* tp_doc */ itertools_count__doc__, /* tp_doc */
(traverseproc)count_traverse, /* tp_traverse */ (traverseproc)count_traverse, /* tp_traverse */
0, /* tp_clear */ 0, /* tp_clear */
0, /* tp_richcompare */ 0, /* tp_richcompare */
@ -4190,7 +4215,7 @@ static PyTypeObject count_type = {
0, /* tp_dictoffset */ 0, /* tp_dictoffset */
0, /* tp_init */ 0, /* tp_init */
0, /* tp_alloc */ 0, /* tp_alloc */
count_new, /* tp_new */ itertools_count, /* tp_new */
PyObject_GC_Del, /* tp_free */ PyObject_GC_Del, /* tp_free */
}; };
@ -4349,6 +4374,7 @@ static PyTypeObject repeat_type = {
PyObject_GC_Del, /* tp_free */ PyObject_GC_Del, /* tp_free */
}; };
/* ziplongest object *********************************************************/ /* ziplongest object *********************************************************/
typedef struct { typedef struct {
@ -4619,6 +4645,7 @@ static PyTypeObject ziplongest_type = {
PyObject_GC_Del, /* tp_free */ PyObject_GC_Del, /* tp_free */
}; };
/* module level code ********************************************************/ /* module level code ********************************************************/
PyDoc_STRVAR(module_doc, PyDoc_STRVAR(module_doc,
@ -4653,7 +4680,7 @@ combinations_with_replacement(p, r)\n\
static PyMethodDef module_methods[] = { static PyMethodDef module_methods[] = {
{"tee", (PyCFunction)tee, METH_VARARGS, tee_doc}, ITERTOOLS_TEE_METHODDEF
{NULL, NULL} /* sentinel */ {NULL, NULL} /* sentinel */
}; };