diff options
author | Raymond Hettinger <python@rcn.com> | 2010-09-16 19:10:17 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2010-09-16 19:10:17 (GMT) |
commit | 35c87f2b8e5cc62c91a3bdbaec4de50d366f6228 (patch) | |
tree | ed16a4b9ea45825df7510db71ae11ea1a6ebf6b3 | |
parent | 234f88dc73d4324851c4b624110f7afe699c1dbf (diff) | |
download | cpython-35c87f2b8e5cc62c91a3bdbaec4de50d366f6228.zip cpython-35c87f2b8e5cc62c91a3bdbaec4de50d366f6228.tar.gz cpython-35c87f2b8e5cc62c91a3bdbaec4de50d366f6228.tar.bz2 |
Issue 9865: add __sizeof__ to OrderedDict.
-rw-r--r-- | Lib/collections.py | 31 | ||||
-rw-r--r-- | Lib/test/test_collections.py | 6 | ||||
-rw-r--r-- | Misc/NEWS | 2 |
3 files changed, 28 insertions, 11 deletions
diff --git a/Lib/collections.py b/Lib/collections.py index 68e9b28..f05d7b4 100644 --- a/Lib/collections.py +++ b/Lib/collections.py @@ -97,17 +97,6 @@ class OrderedDict(dict, MutableMapping): yield curr.key curr = curr.prev - def __reduce__(self): - 'Return state information for pickling' - items = [[k, self[k]] for k in self] - tmp = self.__map, self.__root, self.__hardroot - del self.__map, self.__root, self.__hardroot - inst_dict = vars(self).copy() - self.__map, self.__root, self.__hardroot = tmp - if inst_dict: - return (self.__class__, (items,), inst_dict) - return self.__class__, (items,) - def clear(self): 'od.clear() -> None. Remove all items from od.' root = self.__root @@ -162,6 +151,26 @@ class OrderedDict(dict, MutableMapping): link.next = first root.next = first.prev = link + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + tmp = self.__map, self.__root, self.__hardroot + del self.__map, self.__root, self.__hardroot + inst_dict = vars(self).copy() + self.__map, self.__root, self.__hardroot = tmp + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def __sizeof__(self): + sizeof = _sys.getsizeof + n = len(self) + 1 # number of links including root + size = sizeof(self.__dict__) # instance dictionary + size += sizeof(self.__map) * 2 # internal dict and inherited dict + size += sizeof(self.__hardroot) * n # link objects + size += sizeof(self.__root) * n # proxy objects + return size + setdefault = MutableMapping.setdefault update = MutableMapping.update pop = MutableMapping.pop diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py index 514dc39..51e93e4 100644 --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -994,6 +994,12 @@ class TestOrderedDict(unittest.TestCase): with self.assertRaises(KeyError): od.move_to_end('x') + def test_sizeof(self): + # Wimpy test: Just verify the reported size is larger than a regular dict + d = dict(a=1) + od = OrderedDict(**d) + self.assertGreater(sys.getsizeof(od), sys.getsizeof(d)) + class GeneralMappingTests(mapping_tests.BasicTestMappingProtocol): type2test = OrderedDict @@ -52,6 +52,8 @@ Core and Builtins Library ------- +- Issue #9865: collections.OrderedDict now has a __sizeof__ method. + - Issue #9854: The default read() implementation in io.RawIOBase now handles non-blocking readinto() returning None correctly. |