diff options
author | David Wolever <david@wolever.net> | 2008-03-19 02:35:45 +0000 |
---|---|---|
committer | David Wolever <david@wolever.net> | 2008-03-19 02:35:45 +0000 |
commit | 2724ab99c8c81cdb032372871d8f1eebb171ebe7 (patch) | |
tree | 536d452a552c67fc395e7049db451df5ee296eaa | |
parent | fbe7c559054e33a74a330462aa8ae0682910a414 (diff) | |
download | cpython-git-2724ab99c8c81cdb032372871d8f1eebb171ebe7.tar.gz |
Added zip, map, filter to future_bultins (#2171)
-rw-r--r-- | Lib/test/test_future_builtins.py | 14 | ||||
-rw-r--r-- | Lib/test/test_py3kwarn.py | 11 | ||||
-rw-r--r-- | Modules/future_builtins.c | 15 | ||||
-rw-r--r-- | Modules/itertoolsmodule.c | 13 |
4 files changed, 49 insertions, 4 deletions
diff --git a/Lib/test/test_future_builtins.py b/Lib/test/test_future_builtins.py index 69e719bc3b..0e16caf5d0 100644 --- a/Lib/test/test_future_builtins.py +++ b/Lib/test/test_future_builtins.py @@ -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) diff --git a/Lib/test/test_py3kwarn.py b/Lib/test/test_py3kwarn.py index cdb1038449..cc1e9f4d50 100644 --- a/Lib/test/test_py3kwarn.py +++ b/Lib/test/test_py3kwarn.py @@ -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): diff --git a/Modules/future_builtins.c b/Modules/future_builtins.c index 686925d317..5baaa6051d 100644 --- a/Modules/future_builtins.c +++ b/Modules/future_builtins.c @@ -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 */ } diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index 8c3375a81d..a369dc9f16 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -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 |