Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add pickle tests on mutable key/value
  • Loading branch information
vstinner committed Feb 19, 2026
commit 64cba52c210b8a9dcdf7229e39ed07c1dee4f947
3 changes: 3 additions & 0 deletions Lib/test/picklecommon.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,9 @@ class MyUnicode(str):
class MyUnicode(unicode):
sample = unicode(r"hello \u1234", "raw-unicode-escape")

class DictKey:
pass

class MyTuple(tuple):
sample = (1, 2, 3)

Expand Down
48 changes: 48 additions & 0 deletions Lib/test/pickletester.py
Original file line number Diff line number Diff line change
Expand Up @@ -2911,6 +2911,54 @@ def test_recursive_set_subclass_and_inst(self):
def test_recursive_frozenset_subclass_and_inst(self):
self._test_recursive_collection_and_inst(MyFrozenSet)

def _test_recursive_collection_in_key(self, factory, minprotocol=0):
protocols = range(minprotocol, pickle.HIGHEST_PROTOCOL + 1)
key = DictKey()
Comment thread
vstinner marked this conversation as resolved.
Outdated
o = factory({key: 1})
key.attr = o
for proto in protocols:
with self.subTest(proto=proto):
s = self.dumps(o, proto)
x = self.loads(s)
keys = list(x.keys())
self.assertEqual(len(keys), 1)
self.assertIs(keys[0].attr, x)

def test_recursive_dict_in_key(self):
self._test_recursive_collection_in_key(dict)

def test_recursive_dict_subclass_in_key(self):
self._test_recursive_collection_in_key(MyDict)
Comment thread
vstinner marked this conversation as resolved.
Outdated

def test_recursive_frozendict_in_key(self):
self._test_recursive_collection_in_key(frozendict, minprotocol=2)

def test_recursive_frozendict_subclass_in_key(self):
self._test_recursive_collection_in_key(MyFrozenDict)

def _test_recursive_collection_in_value(self, factory, minprotocol=0):
protocols = range(minprotocol, pickle.HIGHEST_PROTOCOL + 1)
o = factory(key=[])
o['key'].append(o)
for proto in protocols:
with self.subTest(proto=proto):
s = self.dumps(o, proto)
x = self.loads(s)
self.assertEqual(len(x['key']), 1)
self.assertIs(x['key'][0], x)

def test_recursive_dict_in_value(self):
self._test_recursive_collection_in_value(dict)

def test_recursive_dict_subclass_in_value(self):
self._test_recursive_collection_in_value(MyDict)
Comment thread
vstinner marked this conversation as resolved.
Outdated

def test_recursive_frozendict_in_value(self):
self._test_recursive_collection_in_value(frozendict, minprotocol=2)

def test_recursive_frozendict_subclass_in_value(self):
self._test_recursive_collection_in_value(MyFrozenDict)

def test_recursive_inst_state(self):
# Mutable object containing itself.
y = REX_state()
Expand Down
Loading