Skip to content

Commit b01786c

Browse files
chrahuntericvsmith
authored andcommitted
bpo-35960: Fix dataclasses.field throwing away empty metadata. (GH-11815)
1 parent a31f4cc commit b01786c

File tree

3 files changed

+15
-3
lines changed

3 files changed

+15
-3
lines changed

Lib/dataclasses.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ def __init__(self, default, default_factory, init, repr, hash, compare,
241241
self.hash = hash
242242
self.compare = compare
243243
self.metadata = (_EMPTY_METADATA
244-
if metadata is None or len(metadata) == 0 else
244+
if metadata is None else
245245
types.MappingProxyType(metadata))
246246
self._field_type = None
247247

Lib/test/test_dataclasses.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1737,23 +1737,33 @@ class C:
17371737
i: int = field(metadata=0)
17381738

17391739
# Make sure an empty dict works.
1740+
d = {}
17401741
@dataclass
17411742
class C:
1742-
i: int = field(metadata={})
1743+
i: int = field(metadata=d)
17431744
self.assertFalse(fields(C)[0].metadata)
17441745
self.assertEqual(len(fields(C)[0].metadata), 0)
1746+
# Update should work (see bpo-35960).
1747+
d['foo'] = 1
1748+
self.assertEqual(len(fields(C)[0].metadata), 1)
1749+
self.assertEqual(fields(C)[0].metadata['foo'], 1)
17451750
with self.assertRaisesRegex(TypeError,
17461751
'does not support item assignment'):
17471752
fields(C)[0].metadata['test'] = 3
17481753

17491754
# Make sure a non-empty dict works.
1755+
d = {'test': 10, 'bar': '42', 3: 'three'}
17501756
@dataclass
17511757
class C:
1752-
i: int = field(metadata={'test': 10, 'bar': '42', 3: 'three'})
1758+
i: int = field(metadata=d)
17531759
self.assertEqual(len(fields(C)[0].metadata), 3)
17541760
self.assertEqual(fields(C)[0].metadata['test'], 10)
17551761
self.assertEqual(fields(C)[0].metadata['bar'], '42')
17561762
self.assertEqual(fields(C)[0].metadata[3], 'three')
1763+
# Update should work.
1764+
d['foo'] = 1
1765+
self.assertEqual(len(fields(C)[0].metadata), 4)
1766+
self.assertEqual(fields(C)[0].metadata['foo'], 1)
17571767
with self.assertRaises(KeyError):
17581768
# Non-existent key.
17591769
fields(C)[0].metadata['baz']
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix :func:`dataclasses.field` throwing away empty mapping objects passed as
2+
metadata.

0 commit comments

Comments
 (0)