summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2003-11-21 18:36:54 (GMT)
committerRaymond Hettinger <python@rcn.com>2003-11-21 18:36:54 (GMT)
commit19c2d77842290af9b5f470c1eea2a71d1f77c9fe (patch)
treeb803a0c96878f6bbef74c8f306df3e950f63da62
parent3fbec701cae361de6beca55bc926e0540635f165 (diff)
downloadcpython-19c2d77842290af9b5f470c1eea2a71d1f77c9fe.zip
cpython-19c2d77842290af9b5f470c1eea2a71d1f77c9fe.tar.gz
cpython-19c2d77842290af9b5f470c1eea2a71d1f77c9fe.tar.bz2
Allow temporary hashability for the __contains__ test.
(Requested by Alex Martelli.)
-rw-r--r--Lib/test/test_set.py2
-rw-r--r--Objects/setobject.c18
2 files changed, 19 insertions, 1 deletions
diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py
index c33461d..3203d51 100644
--- a/Lib/test/test_set.py
+++ b/Lib/test/test_set.py
@@ -35,6 +35,8 @@ class TestJointOps(unittest.TestCase):
for c in self.letters:
self.assertEqual(c in self.s, c in self.d)
self.assertRaises(TypeError, self.s.__contains__, [[]])
+ s = self.thetype([frozenset(self.letters)])
+ self.assert_(self.thetype(self.letters) in s)
def test_copy(self):
dup = self.s.copy()
diff --git a/Objects/setobject.c b/Objects/setobject.c
index 88d5640..2d77c74 100644
--- a/Objects/setobject.c
+++ b/Objects/setobject.c
@@ -104,7 +104,23 @@ set_len(PySetObject *so)
static int
set_contains(PySetObject *so, PyObject *key)
{
- return PySequence_Contains(so->data, key);
+ PyObject *olddict;
+ PySetObject *tmp;
+ int result;
+
+ result = PySequence_Contains(so->data, key);
+ if (result == -1 && PyType_IsSubtype(key->ob_type, &PySet_Type)) {
+ PyErr_Clear();
+ tmp = (PySetObject *)make_new_set(&PyFrozenSet_Type, NULL);
+ if (tmp == NULL)
+ return -1;
+ olddict = tmp->data;
+ tmp->data = ((PySetObject *)(key))->data;
+ result = PySequence_Contains(so->data, (PyObject *)tmp);
+ tmp->data = olddict;
+ Py_DECREF(tmp);
+ }
+ return result;
}
static PyObject *