]> granicus.if.org Git - python/commitdiff
Added zip, map, filter to future_bultins (#2171)
authorDavid Wolever <david@wolever.net>
Wed, 19 Mar 2008 02:35:45 +0000 (02:35 +0000)
committerDavid Wolever <david@wolever.net>
Wed, 19 Mar 2008 02:35:45 +0000 (02:35 +0000)
Lib/test/test_future_builtins.py
Lib/test/test_py3kwarn.py
Modules/future_builtins.c
Modules/itertoolsmodule.c

index 69e719bc3b322893954658937b3cad34f905427f..0e16caf5d02cc4515f1d1926aba775559f68fa4a 100644 (file)
@@ -1,7 +1,8 @@
 import test.test_support, unittest
 
 # we're testing the behavior of these future builtins:
-from future_builtins import hex, oct
+from future_builtins import hex, oct, map, zip, filter
+from test import test_support
 
 class BuiltinTest(unittest.TestCase):
     def test_hex(self):
@@ -20,6 +21,17 @@ class BuiltinTest(unittest.TestCase):
         self.assertEqual(oct(-100L), '-0o144')
         self.assertRaises(TypeError, oct, ())
 
+    def test_itertools(self):
+        from itertools import imap, izip, ifilter
+        # We will assume that the itertools functions work, so provided
+        # that we've got identical coppies, we will work!
+        self.assertEqual(map, imap)
+        self.assertEqual(zip, izip)
+        self.assertEqual(filter, ifilter)
+        # Testing that filter(None, stuff) raises a warning lives in
+        # test_py3kwarn.py
+
+
 def test_main(verbose=None):
     test.test_support.run_unittest(BuiltinTest)
 
index cdb103844972da7aec9e2a537f4f36cd68d290df..cc1e9f4d50916165c34911f2dc24b8c49cc387e0 100644 (file)
@@ -50,6 +50,17 @@ class TestPy3KWarnings(unittest.TestCase):
         with catch_warning() as w:
             self.assertWarning(cell0 < cell1, w, expected)
 
+    def test_filter(self):
+        from itertools import ifilter
+        from future_builtins import filter
+        expected = 'ifilter with None as a first argument is not supported '\
+                   'in 3.x.  Use a list comprehension instead.'
+
+        with catch_warning() as w:
+            self.assertWarning(ifilter(None, []), w, expected)
+        with catch_warning() as w:
+            self.assertWarning(filter(None, []), w, expected)
+
     def test_code_inequality_comparisons(self):
         expected = 'code inequality comparisons not supported in 3.x.'
         def f(x):
index 686925d317f1cbef139746d7a7dc6f9c7e0f6daf..5baaa6051dd4ec282b7e4d1655e20cb745e62765 100644 (file)
@@ -59,11 +59,24 @@ static PyMethodDef module_functions[] = {
 PyMODINIT_FUNC
 initfuture_builtins(void)
 {
-       PyObject *m;
+       PyObject *m, *itertools, *iter_func;
+       char *it_funcs[] = {"imap", "ifilter", "izip", NULL};
+       char **cur_func;
 
        m = Py_InitModule3("future_builtins", module_functions, module_doc);
        if (m == NULL)
                return;
 
+       itertools = PyImport_ImportModuleNoBlock("itertools");
+       if (itertools == NULL)
+               return;
+
+       for (cur_func = it_funcs; *cur_func; ++cur_func){
+               iter_func = PyObject_GetAttrString(itertools, *cur_func);
+               if (iter_func == NULL)
+                       return;
+               PyModule_AddObject(m, *cur_func+1, iter_func);
+       }
+       Py_DECREF(itertools);
        /* any other initialization needed */
 }
index 8c3375a81dfafeda0f3e4b0c644e3b4c2eb4cf9a..a369dc9f166d089708f6ec51abafa54cf6066336 100644 (file)
@@ -2542,7 +2542,7 @@ ifilter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
        ifilterobject *lz;
 
        if (Py_Py3kWarningFlag &&
-           PyErr_Warn(PyExc_DeprecationWarning, 
+           PyErr_Warn(PyExc_DeprecationWarning,
                       "In 3.x, itertools.ifilter() was moved to builtin filter().") < 0)
                return NULL;
 
@@ -2552,6 +2552,15 @@ ifilter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
        if (!PyArg_UnpackTuple(args, "ifilter", 2, 2, &func, &seq))
                return NULL;
 
+       if (func == Py_None) {
+               if (Py_Py3kWarningFlag &&
+                   PyErr_Warn(PyExc_DeprecationWarning,
+                              "ifilter with None as a first argument "
+                              "is not supported in 3.x.  Use a list "
+                              "comprehension instead.") < 0)
+                       return NULL;
+       }
+
        /* Get iterator. */
        it = PyObject_GetIter(seq);
        if (it == NULL)
@@ -3602,7 +3611,7 @@ inititertools(void)
                &izip_type,
                &iziplongest_type,
                &permutations_type,
-               &product_type,         
+               &product_type,
                &repeat_type,
                &groupby_type,
                NULL