mirror of
https://github.com/python/cpython.git
synced 2025-11-12 15:09:14 +00:00
Let set.union() and set.update() accept multiple inputs.
This commit is contained in:
parent
ecbdd2e9b0
commit
ee4bcad68e
4 changed files with 65 additions and 27 deletions
|
|
@ -1567,11 +1567,14 @@ The constructors for both classes work the same:
|
||||||
Test whether the set is a true superset of *other*, that is, ``set >=
|
Test whether the set is a true superset of *other*, that is, ``set >=
|
||||||
other and set != other``.
|
other and set != other``.
|
||||||
|
|
||||||
.. method:: union(other)
|
.. method:: union(other, ...)
|
||||||
set | other
|
set | other | ...
|
||||||
|
|
||||||
Return a new set with elements from both sets.
|
Return a new set with elements from both sets.
|
||||||
|
|
||||||
|
.. versionchanged:: 2.6
|
||||||
|
Accepts multiple input iterables.
|
||||||
|
|
||||||
.. method:: intersection(other)
|
.. method:: intersection(other)
|
||||||
set & other
|
set & other
|
||||||
|
|
||||||
|
|
@ -1628,11 +1631,14 @@ The constructors for both classes work the same:
|
||||||
The following table lists operations available for :class:`set` that do not
|
The following table lists operations available for :class:`set` that do not
|
||||||
apply to immutable instances of :class:`frozenset`:
|
apply to immutable instances of :class:`frozenset`:
|
||||||
|
|
||||||
.. method:: update(other)
|
.. method:: update(other, ...)
|
||||||
set |= other
|
set |= other | ...
|
||||||
|
|
||||||
Update the set, adding elements from *other*.
|
Update the set, adding elements from *other*.
|
||||||
|
|
||||||
|
.. versionchanged:: 2.6
|
||||||
|
Accepts multiple input iterables.
|
||||||
|
|
||||||
.. method:: intersection_update(other)
|
.. method:: intersection_update(other)
|
||||||
set &= other
|
set &= other
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,7 @@ class TestJointOps(unittest.TestCase):
|
||||||
self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
|
self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
|
||||||
self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
|
self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
|
||||||
self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
|
self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
|
||||||
|
self.assertEqual(self.thetype('abcba').union(C('ef'), C('fg')), set('abcefg'))
|
||||||
|
|
||||||
def test_or(self):
|
def test_or(self):
|
||||||
i = self.s.union(self.otherword)
|
i = self.s.union(self.otherword)
|
||||||
|
|
@ -401,6 +402,12 @@ class TestSet(TestJointOps):
|
||||||
s = self.thetype('abcba')
|
s = self.thetype('abcba')
|
||||||
self.assertEqual(s.update(C(p)), None)
|
self.assertEqual(s.update(C(p)), None)
|
||||||
self.assertEqual(s, set(q))
|
self.assertEqual(s, set(q))
|
||||||
|
for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
|
||||||
|
q = 'ahi'
|
||||||
|
for C in set, frozenset, dict.fromkeys, str, unicode, list, tuple:
|
||||||
|
s = self.thetype('abcba')
|
||||||
|
self.assertEqual(s.update(C(p), C(q)), None)
|
||||||
|
self.assertEqual(s, set(s) | set(p) | set(q))
|
||||||
|
|
||||||
def test_ior(self):
|
def test_ior(self):
|
||||||
self.s |= set(self.otherword)
|
self.s |= set(self.otherword)
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,8 @@ What's New in Python 2.6 beta 1?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- The set methods, update() and union() now accept multiple arguments.
|
||||||
|
|
||||||
- Issue #2898: Added sys.getsizeof() to retrieve size of objects in bytes.
|
- Issue #2898: Added sys.getsizeof() to retrieve size of objects in bytes.
|
||||||
|
|
||||||
- New environment variable PYTHONIOENCODING.
|
- New environment variable PYTHONIOENCODING.
|
||||||
|
|
|
||||||
|
|
@ -967,15 +967,20 @@ set_update_internal(PySetObject *so, PyObject *other)
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
set_update(PySetObject *so, PyObject *other)
|
set_update(PySetObject *so, PyObject *args)
|
||||||
{
|
{
|
||||||
|
Py_ssize_t i;
|
||||||
|
|
||||||
|
for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
|
||||||
|
PyObject *other = PyTuple_GET_ITEM(args, i);
|
||||||
if (set_update_internal(so, other) == -1)
|
if (set_update_internal(so, other) == -1)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
PyDoc_STRVAR(update_doc,
|
PyDoc_STRVAR(update_doc,
|
||||||
"Update a set with the union of itself and another.");
|
"Update a set with the union of itself and others.");
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
make_new_set(PyTypeObject *type, PyObject *iterable)
|
make_new_set(PyTypeObject *type, PyObject *iterable)
|
||||||
|
|
@ -1156,9 +1161,42 @@ set_clear(PySetObject *so)
|
||||||
PyDoc_STRVAR(clear_doc, "Remove all elements from this set.");
|
PyDoc_STRVAR(clear_doc, "Remove all elements from this set.");
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
set_union(PySetObject *so, PyObject *other)
|
set_union(PySetObject *so, PyObject *args)
|
||||||
{
|
{
|
||||||
PySetObject *result;
|
PySetObject *result;
|
||||||
|
PyObject *other;
|
||||||
|
Py_ssize_t i;
|
||||||
|
|
||||||
|
result = (PySetObject *)set_copy(so);
|
||||||
|
if (result == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (i=0 ; i<PyTuple_GET_SIZE(args) ; i++) {
|
||||||
|
other = PyTuple_GET_ITEM(args, i);
|
||||||
|
if ((PyObject *)so == other)
|
||||||
|
return (PyObject *)result;
|
||||||
|
if (set_update_internal(result, other) == -1) {
|
||||||
|
Py_DECREF(result);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (PyObject *)result;
|
||||||
|
}
|
||||||
|
|
||||||
|
PyDoc_STRVAR(union_doc,
|
||||||
|
"Return the union of sets as a new set.\n\
|
||||||
|
\n\
|
||||||
|
(i.e. all elements that are in either set.)");
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
set_or(PySetObject *so, PyObject *other)
|
||||||
|
{
|
||||||
|
PySetObject *result;
|
||||||
|
|
||||||
|
if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
|
||||||
|
Py_INCREF(Py_NotImplemented);
|
||||||
|
return Py_NotImplemented;
|
||||||
|
}
|
||||||
|
|
||||||
result = (PySetObject *)set_copy(so);
|
result = (PySetObject *)set_copy(so);
|
||||||
if (result == NULL)
|
if (result == NULL)
|
||||||
|
|
@ -1172,21 +1210,6 @@ set_union(PySetObject *so, PyObject *other)
|
||||||
return (PyObject *)result;
|
return (PyObject *)result;
|
||||||
}
|
}
|
||||||
|
|
||||||
PyDoc_STRVAR(union_doc,
|
|
||||||
"Return the union of two sets as a new set.\n\
|
|
||||||
\n\
|
|
||||||
(i.e. all elements that are in either set.)");
|
|
||||||
|
|
||||||
static PyObject *
|
|
||||||
set_or(PySetObject *so, PyObject *other)
|
|
||||||
{
|
|
||||||
if (!PyAnySet_Check(so) || !PyAnySet_Check(other)) {
|
|
||||||
Py_INCREF(Py_NotImplemented);
|
|
||||||
return Py_NotImplemented;
|
|
||||||
}
|
|
||||||
return set_union(so, other);
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
set_ior(PySetObject *so, PyObject *other)
|
set_ior(PySetObject *so, PyObject *other)
|
||||||
{
|
{
|
||||||
|
|
@ -1947,9 +1970,9 @@ static PyMethodDef set_methods[] = {
|
||||||
{"test_c_api", (PyCFunction)test_c_api, METH_NOARGS,
|
{"test_c_api", (PyCFunction)test_c_api, METH_NOARGS,
|
||||||
test_c_api_doc},
|
test_c_api_doc},
|
||||||
#endif
|
#endif
|
||||||
{"union", (PyCFunction)set_union, METH_O,
|
{"union", (PyCFunction)set_union, METH_VARARGS,
|
||||||
union_doc},
|
union_doc},
|
||||||
{"update", (PyCFunction)set_update, METH_O,
|
{"update", (PyCFunction)set_update, METH_VARARGS,
|
||||||
update_doc},
|
update_doc},
|
||||||
{NULL, NULL} /* sentinel */
|
{NULL, NULL} /* sentinel */
|
||||||
};
|
};
|
||||||
|
|
@ -2062,7 +2085,7 @@ static PyMethodDef frozenset_methods[] = {
|
||||||
reduce_doc},
|
reduce_doc},
|
||||||
{"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O,
|
{"symmetric_difference",(PyCFunction)set_symmetric_difference, METH_O,
|
||||||
symmetric_difference_doc},
|
symmetric_difference_doc},
|
||||||
{"union", (PyCFunction)set_union, METH_O,
|
{"union", (PyCFunction)set_union, METH_VARARGS,
|
||||||
union_doc},
|
union_doc},
|
||||||
{NULL, NULL} /* sentinel */
|
{NULL, NULL} /* sentinel */
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue