Let set.intersection() and set.intersection_update() take multiple input arguments.
authorRaymond Hettinger <python@rcn.com>
Mon, 9 Jun 2008 13:07:27 +0000 (13:07 +0000)
committerRaymond Hettinger <python@rcn.com>
Mon, 9 Jun 2008 13:07:27 +0000 (13:07 +0000)
Doc/library/stdtypes.rst
Lib/test/test_set.py
Misc/NEWS
Objects/setobject.c

index 1d8e053609df92b3e98e64298a86f43d86045421..758ee7bd63710d26dd2605e91135d6834efe4e06 100644 (file)
@@ -1575,11 +1575,14 @@ The constructors for both classes work the same:
       .. versionchanged:: 2.6
          Accepts multiple input iterables.
 
-   .. method:: intersection(other)
-               set & other
+   .. method:: intersection(other, ...)
+               set & other & ...
 
       Return a new set with elements common to both sets.
 
+      .. versionchanged:: 2.6
+         Accepts multiple input iterables.
+
    .. method:: difference(other)
                set - other
 
@@ -1639,11 +1642,14 @@ The constructors for both classes work the same:
       .. versionchanged:: 2.6
          Accepts multiple input iterables.
 
-   .. method:: intersection_update(other)
-               set &= other
+   .. method:: intersection_update(other, ...)
+               set &= other & ...
 
       Update the set, keeping only elements found in it and *other*.
 
+      .. versionchanged:: 2.6
+         Accepts multiple input iterables.
+
    .. method:: difference_update(other)
                set -= other
 
index 37a085cf77c8e7256f7764ae10a761f3dc15c441..729cc3b209ca84f96427ebf4c3ce19e9a9047670 100644 (file)
@@ -103,6 +103,7 @@ class TestJointOps(unittest.TestCase):
             self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
             self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
             self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
+            self.assertEqual(self.thetype('abcba').intersection(C('cbcf'), C('bag')), set('b'))
 
     def test_isdisjoint(self):
         def f(s1, s2):
@@ -429,6 +430,11 @@ class TestSet(TestJointOps):
                 s = self.thetype('abcba')
                 self.assertEqual(s.intersection_update(C(p)), None)
                 self.assertEqual(s, set(q))
+                ss = 'abcba'
+                s = self.thetype(ss)
+                t = 'cbc'
+                self.assertEqual(s.intersection_update(C(p), C(t)), None)
+                self.assertEqual(s, set('abcba')&set(p)&set(t))
 
     def test_iand(self):
         self.s &= set(self.otherword)
index 05f741975af1be69ebacfbad560ff25801a54655..8f4963bb85863e6cc5663c6e5dd8f8df5e1f1044 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,7 +12,8 @@ What's New in Python 2.6 beta 1?
 Core and Builtins
 -----------------
 
-- The set methods, update() and union() now accept multiple arguments.
+- Several set methods now accept multiple arguments:  update(), union(),
+  intersection() and intersection_update().
 
 - Issue #2898: Added sys.getsizeof() to retrieve size of objects in bytes.
 
index 908a9a3d0978c825d7c48dd92ca1253429412750..a892dc8ae135c6ae03f375229f758626ea2999b2 100644 (file)
@@ -1306,6 +1306,26 @@ set_intersection(PySetObject *so, PyObject *other)
        return (PyObject *)result;
 }
 
+static PyObject *
+set_intersection_multi(PySetObject *so, PyObject *args)
+{
+       Py_ssize_t i;
+       PyObject *result = (PyObject *)so;
+
+       Py_INCREF(so);
+       for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
+               PyObject *other = PyTuple_GET_ITEM(args, i);
+               PyObject *newresult = set_intersection((PySetObject *)result, other);
+               if (newresult == NULL) {
+                       Py_DECREF(result);
+                       return NULL;
+               }
+               Py_DECREF(result);
+               result = newresult;
+       }
+       return result;
+}
+
 PyDoc_STRVAR(intersection_doc,
 "Return the intersection of two sets as a new set.\n\
 \n\
@@ -1324,6 +1344,19 @@ set_intersection_update(PySetObject *so, PyObject *other)
        Py_RETURN_NONE;
 }
 
+static PyObject *
+set_intersection_update_multi(PySetObject *so, PyObject *args)
+{
+       PyObject *tmp;
+
+       tmp = set_intersection_multi(so, args);
+       if (tmp == NULL)
+               return NULL;
+       set_swap_bodies(so, (PySetObject *)tmp);
+       Py_DECREF(tmp);
+       Py_RETURN_NONE;
+}
+
 PyDoc_STRVAR(intersection_update_doc,
 "Update a set with the intersection of itself and another.");
 
@@ -1946,9 +1979,9 @@ static PyMethodDef set_methods[] = {
         difference_doc},
        {"difference_update",   (PyCFunction)set_difference_update,     METH_O,
         difference_update_doc},
-       {"intersection",(PyCFunction)set_intersection,  METH_O,
+       {"intersection",(PyCFunction)set_intersection_multi,    METH_VARARGS,
         intersection_doc},
-       {"intersection_update",(PyCFunction)set_intersection_update,    METH_O,
+       {"intersection_update",(PyCFunction)set_intersection_update_multi,      METH_VARARGS,
         intersection_update_doc},
        {"isdisjoint",  (PyCFunction)set_isdisjoint,    METH_O,
         isdisjoint_doc},
@@ -2073,7 +2106,7 @@ static PyMethodDef frozenset_methods[] = {
         copy_doc},
        {"difference",  (PyCFunction)set_difference,    METH_O,
         difference_doc},
-       {"intersection",(PyCFunction)set_intersection,  METH_O,
+       {"intersection",(PyCFunction)set_intersection_multi,    METH_VARARGS,
         intersection_doc},
        {"isdisjoint",  (PyCFunction)set_isdisjoint,    METH_O,
         isdisjoint_doc},