]> granicus.if.org Git - python/commitdiff
SF 1062353: set pickling problems
authorRaymond Hettinger <python@rcn.com>
Tue, 9 Nov 2004 07:25:31 +0000 (07:25 +0000)
committerRaymond Hettinger <python@rcn.com>
Tue, 9 Nov 2004 07:25:31 +0000 (07:25 +0000)
Support automatic pickling of dictionaries in instance of set subclasses.

Lib/test/test_set.py
Objects/setobject.c

index aab0c5782c4ee97a4b0bf4293db276706e627467..900d8e42c1593e7c8e424d70c90052bd439a7857 100644 (file)
@@ -175,9 +175,15 @@ class TestJointOps(unittest.TestCase):
         self.failIf(set('cbs').issuperset('a'))
 
     def test_pickling(self):
-        p = pickle.dumps(self.s)
-        dup = pickle.loads(p)
-        self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
+        for i in (0, 1, 2):
+            p = pickle.dumps(self.s, i)
+            dup = pickle.loads(p)
+            self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
+            if type(self.s) not in (set, frozenset):
+                self.s.x = 10
+                p = pickle.dumps(self.s)
+                dup = pickle.loads(p)
+                self.assertEqual(self.s.x, dup.x)
 
     def test_deepcopy(self):
         class Tracer:
index d57217cba31b74b1807395d9aa67cda7f725471f..8ef671e3aff6a6b6f4e96b752cc6c37715329845 100644 (file)
@@ -844,7 +844,7 @@ PyDoc_STRVAR(pop_doc, "Remove and return an arbitrary set element.");
 static PyObject *
 set_reduce(PySetObject *so)
 {
-       PyObject *keys=NULL, *args=NULL, *result=NULL;
+       PyObject *keys=NULL, *args=NULL, *result=NULL, *dict=NULL;
 
        keys = PyDict_Keys(so->data);
        if (keys == NULL)
@@ -852,10 +852,17 @@ set_reduce(PySetObject *so)
        args = PyTuple_Pack(1, keys);
        if (args == NULL)
                goto done;
-       result = PyTuple_Pack(2, so->ob_type, args);
+       dict = PyObject_GetAttrString((PyObject *)so, "__dict__");
+       if (dict == NULL) {
+               PyErr_Clear();
+               dict = Py_None;
+               Py_INCREF(dict);
+       }
+       result = PyTuple_Pack(3, so->ob_type, args, dict);
 done:
        Py_XDECREF(args);
        Py_XDECREF(keys);
+       Py_XDECREF(dict);
        return result;
 }