Skip to content

Commit d2d5e95

Browse files
committed
Add support for frozendict in dataclass asdict and astuple
1 parent 70da972 commit d2d5e95

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

Lib/dataclasses.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1546,7 +1546,7 @@ def _asdict_inner(obj, dict_factory):
15461546
return obj_type(*[_asdict_inner(v, dict_factory) for v in obj])
15471547
else:
15481548
return obj_type(_asdict_inner(v, dict_factory) for v in obj)
1549-
elif issubclass(obj_type, dict):
1549+
elif issubclass(obj_type, (dict, frozendict)):
15501550
if hasattr(obj_type, 'default_factory'):
15511551
# obj is a defaultdict, which has a different constructor from
15521552
# dict as it requires the default_factory as its first arg.
@@ -1610,7 +1610,7 @@ def _astuple_inner(obj, tuple_factory):
16101610
# generator (which is not true for namedtuples, handled
16111611
# above).
16121612
return type(obj)(_astuple_inner(v, tuple_factory) for v in obj)
1613-
elif isinstance(obj, dict):
1613+
elif isinstance(obj, (dict, frozendict)):
16141614
obj_type = type(obj)
16151615
if hasattr(obj_type, 'default_factory'):
16161616
# obj is a defaultdict, which has a different constructor from

Lib/test/test_dataclasses/__init__.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1693,17 +1693,24 @@ class GroupTuple:
16931693
class GroupDict:
16941694
id: int
16951695
users: Dict[str, User]
1696+
@dataclass
1697+
class GroupFrozenDict:
1698+
id: int
1699+
users: frozendict[str, User]
16961700
a = User('Alice', 1)
16971701
b = User('Bob', 2)
16981702
gl = GroupList(0, [a, b])
16991703
gt = GroupTuple(0, (a, b))
17001704
gd = GroupDict(0, {'first': a, 'second': b})
1705+
gfd = GroupFrozenDict(0, frozendict({'first': a, 'second': b}))
17011706
self.assertEqual(asdict(gl), {'id': 0, 'users': [{'name': 'Alice', 'id': 1},
17021707
{'name': 'Bob', 'id': 2}]})
17031708
self.assertEqual(asdict(gt), {'id': 0, 'users': ({'name': 'Alice', 'id': 1},
17041709
{'name': 'Bob', 'id': 2})})
1705-
self.assertEqual(asdict(gd), {'id': 0, 'users': {'first': {'name': 'Alice', 'id': 1},
1706-
'second': {'name': 'Bob', 'id': 2}}})
1710+
expected_dict = {'id': 0, 'users': {'first': {'name': 'Alice', 'id': 1},
1711+
'second': {'name': 'Bob', 'id': 2}}}
1712+
self.assertEqual(asdict(gd), expected_dict)
1713+
self.assertEqual(asdict(gfd), expected_dict)
17071714

17081715
def test_helper_asdict_builtin_object_containers(self):
17091716
@dataclass
@@ -1884,14 +1891,21 @@ class GroupTuple:
18841891
class GroupDict:
18851892
id: int
18861893
users: Dict[str, User]
1894+
@dataclass
1895+
class GroupFrozenDict:
1896+
id: int
1897+
users: frozendict[str, User]
18871898
a = User('Alice', 1)
18881899
b = User('Bob', 2)
18891900
gl = GroupList(0, [a, b])
18901901
gt = GroupTuple(0, (a, b))
18911902
gd = GroupDict(0, {'first': a, 'second': b})
1903+
gfd = GroupFrozenDict(0, frozendict({'first': a, 'second': b}))
18921904
self.assertEqual(astuple(gl), (0, [('Alice', 1), ('Bob', 2)]))
18931905
self.assertEqual(astuple(gt), (0, (('Alice', 1), ('Bob', 2))))
1894-
self.assertEqual(astuple(gd), (0, {'first': ('Alice', 1), 'second': ('Bob', 2)}))
1906+
d = {'first': ('Alice', 1), 'second': ('Bob', 2)}
1907+
self.assertEqual(astuple(gd), (0, d))
1908+
self.assertEqual(astuple(gfd), (0, frozendict(d)))
18951909

18961910
def test_helper_astuple_builtin_object_containers(self):
18971911
@dataclass

0 commit comments

Comments
 (0)