[Python-checkins] r60013 - in python/trunk: Doc/library/itertools.rst Lib/test/test_itertools.py Misc/NEWS Modules/itertoolsmodule.c

raymond.hettinger python-checkins at python.org
Thu Jan 17 04:02:15 CET 2008


Author: raymond.hettinger
Date: Thu Jan 17 04:02:14 2008
New Revision: 60013
Modified:
 python/trunk/Doc/library/itertools.rst
 python/trunk/Lib/test/test_itertools.py
 python/trunk/Misc/NEWS
 python/trunk/Modules/itertoolsmodule.c
Log:
Make starmap() match its pure python definition and accept any itertable input (not just tuples).
Modified: python/trunk/Doc/library/itertools.rst
==============================================================================
--- python/trunk/Doc/library/itertools.rst	(original)
+++ python/trunk/Doc/library/itertools.rst	Thu Jan 17 04:02:14 2008
@@ -330,17 +330,19 @@
 
 .. function:: starmap(function, iterable)
 
- Make an iterator that computes the function using arguments tuples obtained from
+ Make an iterator that computes the function using arguments obtained from
 the iterable. Used instead of :func:`imap` when argument parameters are already
 grouped in tuples from a single iterable (the data has been "pre-zipped"). The
 difference between :func:`imap` and :func:`starmap` parallels the distinction
 between ``function(a,b)`` and ``function(*c)``. Equivalent to::
 
 def starmap(function, iterable):
- iterable = iter(iterable)
- while True:
- yield function(*iterable.next())
+ for args in iterable:
+ yield function(*args)
 
+ .. versionchanged:: 2.6
+ Previously, :func:`starmap` required the function arguments to be tuples.
+ Now, any iterable is allowed.
 
 .. function:: takewhile(predicate, iterable)
 
Modified: python/trunk/Lib/test/test_itertools.py
==============================================================================
--- python/trunk/Lib/test/test_itertools.py	(original)
+++ python/trunk/Lib/test/test_itertools.py	Thu Jan 17 04:02:14 2008
@@ -292,7 +292,8 @@
 self.assertEqual(take(3, starmap(operator.pow, izip(count(), count(1)))),
 [0**1, 1**2, 2**3])
 self.assertEqual(list(starmap(operator.pow, [])), [])
- self.assertRaises(TypeError, list, starmap(operator.pow, [[4,5]]))
+ self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5])
+ self.assertRaises(TypeError, list, starmap(operator.pow, [None]))
 self.assertRaises(TypeError, starmap)
 self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra')
 self.assertRaises(TypeError, starmap(10, [(4,5)]).next)
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Thu Jan 17 04:02:14 2008
@@ -993,6 +993,9 @@
 the context manager protocol. The _winreg module also gained a new function
 ``ExpandEnvironmentStrings`` to expand REG_EXPAND_SZ keys.
 
+- itertools.starmap() now accepts any iterable input. Previously, it required
+ the function inputs to be tuples.
+
 - Issue #1646: Make socket support TIPC. The socket module now has support
 for TIPC under Linux, see http://tipc.sf.net/ for more information.
 
Modified: python/trunk/Modules/itertoolsmodule.c
==============================================================================
--- python/trunk/Modules/itertoolsmodule.c	(original)
+++ python/trunk/Modules/itertoolsmodule.c	Thu Jan 17 04:02:14 2008
@@ -1356,10 +1356,11 @@
 	if (args == NULL)
 		return NULL;
 	if (!PyTuple_CheckExact(args)) {
+		PyObject *newargs = PySequence_Tuple(args);
 		Py_DECREF(args);
-		PyErr_SetString(PyExc_TypeError,
-				"iterator must return a tuple");
-		return NULL;
+		if (newargs == NULL)
+			return NULL;
+		args = newargs;
 	}
 	result = PyObject_Call(lz->func, args, NULL);
 	Py_DECREF(args);


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /