summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/stdtypes.rst14
-rw-r--r--Lib/test/test_set.py6
-rw-r--r--Misc/NEWS3
-rw-r--r--Objects/setobject.c39
4 files changed, 54 insertions, 8 deletions
diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst
index 1d8e053..758ee7b 100644
--- a/Doc/library/stdtypes.rst
+++ b/Doc/library/stdtypes.rst
@@ -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
diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py
index 37a085c..729cc3b 100644
--- a/Lib/test/test_set.py
+++ b/Lib/test/test_set.py
@@ -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)
diff --git a/Misc/NEWS b/Misc/NEWS
index 05f7419..8f4963b 100644
--- 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.
diff --git a/Objects/setobject.c b/Objects/setobject.c
index 908a9a3..a892dc8 100644
--- a/Objects/setobject.c
+++ b/Objects/setobject.c
@@ -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},