mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Add two new functions, any() and all().
This commit is contained in:
		
							parent
							
								
									26e512a04f
								
							
						
					
					
						commit
						96229b1918
					
				
					 4 changed files with 129 additions and 0 deletions
				
			
		|  | @ -60,6 +60,32 @@ def my_import(name): | ||||||
|   complex number, its magnitude is returned. |   complex number, its magnitude is returned. | ||||||
| \end{funcdesc} | \end{funcdesc} | ||||||
| 
 | 
 | ||||||
|  | \begin{funcdesc}{all}{iterable} | ||||||
|  |   Return True if all elements of the \var{iterable} are true. | ||||||
|  |   Equivalent to: | ||||||
|  |   \begin{verbatim} | ||||||
|  |      def all(iterable): | ||||||
|  |          for element in iterable: | ||||||
|  |              if not element: | ||||||
|  |                  return False | ||||||
|  |          return True | ||||||
|  |   \end{verbatim} | ||||||
|  |   \versionadded{2.5} | ||||||
|  | \end{funcdesc} | ||||||
|  | 
 | ||||||
|  | \begin{funcdesc}{any}{iterable} | ||||||
|  |   Return True if any element of the \var{iterable} is true. | ||||||
|  |   Equivalent to: | ||||||
|  |   \begin{verbatim} | ||||||
|  |      def any(iterable): | ||||||
|  |          for element in iterable: | ||||||
|  |              if element: | ||||||
|  |                  return True | ||||||
|  |          return False | ||||||
|  |   \end{verbatim} | ||||||
|  |   \versionadded{2.5} | ||||||
|  | \end{funcdesc} | ||||||
|  | 
 | ||||||
| \begin{funcdesc}{basestring}{} | \begin{funcdesc}{basestring}{} | ||||||
|   This abstract type is the superclass for \class{str} and \class{unicode}. |   This abstract type is the superclass for \class{str} and \class{unicode}. | ||||||
|   It cannot be called or instantiated, but it can be used to test whether |   It cannot be called or instantiated, but it can be used to test whether | ||||||
|  |  | ||||||
|  | @ -92,6 +92,14 @@ def write(self, line): | ||||||
|         (unichr(0x200), ValueError), |         (unichr(0x200), ValueError), | ||||||
| ] | ] | ||||||
| 
 | 
 | ||||||
|  | class TestFailingBool: | ||||||
|  |     def __nonzero__(self): | ||||||
|  |         raise RuntimeError | ||||||
|  | 
 | ||||||
|  | class TestFailingIter: | ||||||
|  |     def __iter__(self): | ||||||
|  |         raise RuntimeError | ||||||
|  | 
 | ||||||
| class BuiltinTest(unittest.TestCase): | class BuiltinTest(unittest.TestCase): | ||||||
| 
 | 
 | ||||||
|     def test_import(self): |     def test_import(self): | ||||||
|  | @ -117,6 +125,34 @@ def test_abs(self): | ||||||
|         # str |         # str | ||||||
|         self.assertRaises(TypeError, abs, 'a') |         self.assertRaises(TypeError, abs, 'a') | ||||||
| 
 | 
 | ||||||
|  |     def test_all(self): | ||||||
|  |         self.assertEqual(all([2, 4, 6]), True) | ||||||
|  |         self.assertEqual(all([2, None, 6]), False) | ||||||
|  |         self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6]) | ||||||
|  |         self.assertRaises(RuntimeError, all, TestFailingIter()) | ||||||
|  |         self.assertRaises(TypeError, all, 10)               # Non-iterable | ||||||
|  |         self.assertRaises(TypeError, all)                   # No args | ||||||
|  |         self.assertRaises(TypeError, all, [2, 4, 6], [])    # Too many args | ||||||
|  |         self.assertEqual(all([]), True)                     # Empty iterator | ||||||
|  |         S = [50, 60] | ||||||
|  |         self.assertEqual(all(x > 42 for x in S), True) | ||||||
|  |         S = [50, 40, 60] | ||||||
|  |         self.assertEqual(all(x > 42 for x in S), False) | ||||||
|  | 
 | ||||||
|  |     def test_any(self): | ||||||
|  |         self.assertEqual(any([None, None, None]), False) | ||||||
|  |         self.assertEqual(any([None, 4, None]), True) | ||||||
|  |         self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6]) | ||||||
|  |         self.assertRaises(RuntimeError, all, TestFailingIter()) | ||||||
|  |         self.assertRaises(TypeError, any, 10)               # Non-iterable | ||||||
|  |         self.assertRaises(TypeError, any)                   # No args | ||||||
|  |         self.assertRaises(TypeError, any, [2, 4, 6], [])    # Too many args | ||||||
|  |         self.assertEqual(any([]), False)                    # Empty iterator | ||||||
|  |         S = [40, 60, 30] | ||||||
|  |         self.assertEqual(any(x > 42 for x in S), True) | ||||||
|  |         S = [10, 20, 30] | ||||||
|  |         self.assertEqual(any(x > 42 for x in S), False) | ||||||
|  | 
 | ||||||
|     def test_apply(self): |     def test_apply(self): | ||||||
|         def f0(*args): |         def f0(*args): | ||||||
|             self.assertEqual(args, ()) |             self.assertEqual(args, ()) | ||||||
|  |  | ||||||
|  | @ -10,6 +10,8 @@ What's New in Python 2.5 alpha 1? | ||||||
| Core and builtins | Core and builtins | ||||||
| ----------------- | ----------------- | ||||||
| 
 | 
 | ||||||
|  | - Added two new builtins, any() and all(). | ||||||
|  | 
 | ||||||
| - Defining a class with empty parentheses is now allowed | - Defining a class with empty parentheses is now allowed | ||||||
|   (e.g., ``class C(): pass`` is no longer a syntax error) |   (e.g., ``class C(): pass`` is no longer a syntax error) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -68,6 +68,69 @@ PyDoc_STRVAR(abs_doc, | ||||||
| \n\ | \n\ | ||||||
| Return the absolute value of the argument."); | Return the absolute value of the argument."); | ||||||
| 
 | 
 | ||||||
|  | static PyObject * | ||||||
|  | builtin_all(PyObject *self, PyObject *v) | ||||||
|  | { | ||||||
|  | 	PyObject *it, *item; | ||||||
|  | 
 | ||||||
|  | 	it = PyObject_GetIter(v); | ||||||
|  | 	if (it == NULL) | ||||||
|  | 		return NULL; | ||||||
|  | 
 | ||||||
|  | 	while ((item = PyIter_Next(it)) != NULL) { | ||||||
|  | 		int cmp = PyObject_IsTrue(item); | ||||||
|  | 		Py_DECREF(item); | ||||||
|  | 		if (cmp < 0) { | ||||||
|  | 			Py_DECREF(it); | ||||||
|  | 			return NULL; | ||||||
|  | 		} | ||||||
|  | 		if (cmp == 0) { | ||||||
|  | 			Py_DECREF(it); | ||||||
|  | 			Py_RETURN_FALSE; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	Py_DECREF(it); | ||||||
|  | 	if (PyErr_Occurred()) | ||||||
|  | 		return NULL; | ||||||
|  | 	Py_RETURN_TRUE; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | PyDoc_STRVAR(all_doc, | ||||||
|  | "all(iterable) -> bool\n\
 | ||||||
|  | \n\ | ||||||
|  | Return True if bool(x) is True for all values x in the iterable."); | ||||||
|  | 
 | ||||||
|  | static PyObject * | ||||||
|  | builtin_any(PyObject *self, PyObject *v) | ||||||
|  | { | ||||||
|  | 	PyObject *it, *item; | ||||||
|  | 
 | ||||||
|  | 	it = PyObject_GetIter(v); | ||||||
|  | 	if (it == NULL) | ||||||
|  | 		return NULL; | ||||||
|  | 
 | ||||||
|  | 	while ((item = PyIter_Next(it)) != NULL) { | ||||||
|  | 		int cmp = PyObject_IsTrue(item); | ||||||
|  | 		Py_DECREF(item); | ||||||
|  | 		if (cmp < 0) { | ||||||
|  | 			Py_DECREF(it); | ||||||
|  | 			return NULL; | ||||||
|  | 		} | ||||||
|  | 		if (cmp == 1) { | ||||||
|  | 			Py_DECREF(it); | ||||||
|  | 			Py_RETURN_TRUE; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	Py_DECREF(it); | ||||||
|  | 	if (PyErr_Occurred()) | ||||||
|  | 		return NULL; | ||||||
|  | 	Py_RETURN_FALSE; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | PyDoc_STRVAR(any_doc, | ||||||
|  | "any(iterable) -> bool\n\
 | ||||||
|  | \n\ | ||||||
|  | Return True if bool(x) is True for any x in the iterable."); | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| builtin_apply(PyObject *self, PyObject *args) | builtin_apply(PyObject *self, PyObject *args) | ||||||
|  | @ -2125,6 +2188,8 @@ in length to the length of the shortest argument sequence."); | ||||||
| static PyMethodDef builtin_methods[] = { | static PyMethodDef builtin_methods[] = { | ||||||
|  	{"__import__",	builtin___import__, METH_VARARGS, import_doc}, |  	{"__import__",	builtin___import__, METH_VARARGS, import_doc}, | ||||||
|  	{"abs",		builtin_abs,        METH_O, abs_doc}, |  	{"abs",		builtin_abs,        METH_O, abs_doc}, | ||||||
|  |  	{"all",		builtin_all,        METH_O, all_doc}, | ||||||
|  |  	{"any",		builtin_any,        METH_O, any_doc}, | ||||||
|  	{"apply",	builtin_apply,      METH_VARARGS, apply_doc}, |  	{"apply",	builtin_apply,      METH_VARARGS, apply_doc}, | ||||||
|  	{"callable",	builtin_callable,   METH_O, callable_doc}, |  	{"callable",	builtin_callable,   METH_O, callable_doc}, | ||||||
|  	{"chr",		builtin_chr,        METH_VARARGS, chr_doc}, |  	{"chr",		builtin_chr,        METH_VARARGS, chr_doc}, | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Raymond Hettinger
						Raymond Hettinger