mirror of
https://github.com/python/cpython.git
synced 2025-11-01 14:11:41 +00:00
Add alternate constructor for itertools.chain().
This commit is contained in:
parent
05bf6338b8
commit
b4cbc98c39
3 changed files with 34 additions and 1 deletions
|
|
@ -52,6 +52,13 @@ def test_chain(self):
|
||||||
self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
|
self.assertEqual(take(4, chain('abc', 'def')), list('abcd'))
|
||||||
self.assertRaises(TypeError, list,chain(2, 3))
|
self.assertRaises(TypeError, list,chain(2, 3))
|
||||||
|
|
||||||
|
def test_chain_from_iterable(self):
|
||||||
|
self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef'))
|
||||||
|
self.assertEqual(list(chain.from_iterable(['abc'])), list('abc'))
|
||||||
|
self.assertEqual(list(chain.from_iterable([''])), [])
|
||||||
|
self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd'))
|
||||||
|
self.assertRaises(TypeError, list, chain.from_iterable([2, 3]))
|
||||||
|
|
||||||
def test_combinations(self):
|
def test_combinations(self):
|
||||||
self.assertRaises(TypeError, combinations, 'abc') # missing r argument
|
self.assertRaises(TypeError, combinations, 'abc') # missing r argument
|
||||||
self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
|
self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments
|
||||||
|
|
|
||||||
|
|
@ -1247,6 +1247,8 @@ Extension Modules
|
||||||
- itertools.starmap() now accepts any iterable input. Previously, it required
|
- itertools.starmap() now accepts any iterable input. Previously, it required
|
||||||
the function inputs to be tuples.
|
the function inputs to be tuples.
|
||||||
|
|
||||||
|
- itertools.chain() now has an alterate constructor, chain.from_iterable().
|
||||||
|
|
||||||
- Issue #1646: Make socket support TIPC. The socket module now has support
|
- Issue #1646: Make socket support TIPC. The socket module now has support
|
||||||
for TIPC under Linux, see http://tipc.sf.net/ for more information.
|
for TIPC under Linux, see http://tipc.sf.net/ for more information.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1638,6 +1638,18 @@ chain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
return chain_new_internal(type, source);
|
return chain_new_internal(type, source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
chain_new_from_iterable(PyTypeObject *type, PyObject *arg)
|
||||||
|
{
|
||||||
|
PyObject *source;
|
||||||
|
|
||||||
|
source = PyObject_GetIter(arg);
|
||||||
|
if (source == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return chain_new_internal(type, source);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
chain_dealloc(chainobject *lz)
|
chain_dealloc(chainobject *lz)
|
||||||
{
|
{
|
||||||
|
|
@ -1696,6 +1708,18 @@ 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() contructor taking a single iterable argument\n\
|
||||||
|
that evaluates lazily.");
|
||||||
|
|
||||||
|
static PyMethodDef chain_methods[] = {
|
||||||
|
{"from_iterable", (PyCFunction) chain_new_from_iterable, METH_O | METH_CLASS,
|
||||||
|
chain_from_iterable_doc},
|
||||||
|
{NULL, NULL} /* sentinel */
|
||||||
|
};
|
||||||
|
|
||||||
static PyTypeObject chain_type = {
|
static PyTypeObject chain_type = {
|
||||||
PyVarObject_HEAD_INIT(NULL, 0)
|
PyVarObject_HEAD_INIT(NULL, 0)
|
||||||
"itertools.chain", /* tp_name */
|
"itertools.chain", /* tp_name */
|
||||||
|
|
@ -1726,7 +1750,7 @@ static PyTypeObject chain_type = {
|
||||||
0, /* tp_weaklistoffset */
|
0, /* tp_weaklistoffset */
|
||||||
PyObject_SelfIter, /* tp_iter */
|
PyObject_SelfIter, /* tp_iter */
|
||||||
(iternextfunc)chain_next, /* tp_iternext */
|
(iternextfunc)chain_next, /* tp_iternext */
|
||||||
0, /* tp_methods */
|
chain_methods, /* tp_methods */
|
||||||
0, /* tp_members */
|
0, /* tp_members */
|
||||||
0, /* tp_getset */
|
0, /* tp_getset */
|
||||||
0, /* tp_base */
|
0, /* tp_base */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue