Commit 4b11762f authored by Anssi Kääriäinen's avatar Anssi Kääriäinen
Browse files

Fixed SortedDict.__copy__()

Fixed #18175 -- Calling SortedDict.__copy__() resulted in changes to
the original dictionary. The reason was likely related to subclassing
dict.

Thanks to linovia for report and patch.
parent aa1aa1ad
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -128,6 +128,12 @@ class SortedDict(dict):
        return self.__class__([(key, copy.deepcopy(value, memo))
                               for key, value in self.iteritems()])

    def __copy__(self):
        # The Python's default copy implementation will alter the state
        # of self. The reason for this seems complex but is likely related to
        # subclassing dict.
        return self.copy()

    def __setitem__(self, key, value):
        if key not in self:
            self.keyOrder.append(key)
@@ -200,9 +206,7 @@ class SortedDict(dict):
    def copy(self):
        """Returns a copy of this object."""
        # This way of initializing the copy means it works for subclasses, too.
        obj = self.__class__(self)
        obj.keyOrder = self.keyOrder[:]
        return obj
        return self.__class__(self)

    def __repr__(self):
        """
+6 −0
Original line number Diff line number Diff line
@@ -111,6 +111,12 @@ class SortedDictTests(SimpleTestCase):
            {7: 'seven', 1: 'one', 9: 'nine'}
        )

    def test_copy(self):
        orig = SortedDict(((1, "one"), (0, "zero"), (2, "two")))
        copied = copy.copy(orig)
        self.assertEqual(orig.keys(), [1, 0, 2])
        self.assertEqual(copied.keys(), [1, 0, 2])

    def test_clear(self):
        self.d1.clear()
        self.assertEqual(self.d1, {})