mirror of
https://github.com/python/cpython.git
synced 2026-04-22 03:41:08 +00:00
bpo-35960: Fix dataclasses.field throwing away empty metadata. (GH-11815) (GH-11826)
(cherry picked from commit b01786c881)
Co-authored-by: Christopher Hunt <chrahunt@gmail.com>
This commit is contained in:
parent
58f05ce059
commit
0a834c18cd
3 changed files with 15 additions and 3 deletions
|
|
@ -241,7 +241,7 @@ def __init__(self, default, default_factory, init, repr, hash, compare,
|
|||
self.hash = hash
|
||||
self.compare = compare
|
||||
self.metadata = (_EMPTY_METADATA
|
||||
if metadata is None or len(metadata) == 0 else
|
||||
if metadata is None else
|
||||
types.MappingProxyType(metadata))
|
||||
self._field_type = None
|
||||
|
||||
|
|
|
|||
|
|
@ -1737,23 +1737,33 @@ class C:
|
|||
i: int = field(metadata=0)
|
||||
|
||||
# Make sure an empty dict works.
|
||||
d = {}
|
||||
@dataclass
|
||||
class C:
|
||||
i: int = field(metadata={})
|
||||
i: int = field(metadata=d)
|
||||
self.assertFalse(fields(C)[0].metadata)
|
||||
self.assertEqual(len(fields(C)[0].metadata), 0)
|
||||
# Update should work (see bpo-35960).
|
||||
d['foo'] = 1
|
||||
self.assertEqual(len(fields(C)[0].metadata), 1)
|
||||
self.assertEqual(fields(C)[0].metadata['foo'], 1)
|
||||
with self.assertRaisesRegex(TypeError,
|
||||
'does not support item assignment'):
|
||||
fields(C)[0].metadata['test'] = 3
|
||||
|
||||
# Make sure a non-empty dict works.
|
||||
d = {'test': 10, 'bar': '42', 3: 'three'}
|
||||
@dataclass
|
||||
class C:
|
||||
i: int = field(metadata={'test': 10, 'bar': '42', 3: 'three'})
|
||||
i: int = field(metadata=d)
|
||||
self.assertEqual(len(fields(C)[0].metadata), 3)
|
||||
self.assertEqual(fields(C)[0].metadata['test'], 10)
|
||||
self.assertEqual(fields(C)[0].metadata['bar'], '42')
|
||||
self.assertEqual(fields(C)[0].metadata[3], 'three')
|
||||
# Update should work.
|
||||
d['foo'] = 1
|
||||
self.assertEqual(len(fields(C)[0].metadata), 4)
|
||||
self.assertEqual(fields(C)[0].metadata['foo'], 1)
|
||||
with self.assertRaises(KeyError):
|
||||
# Non-existent key.
|
||||
fields(C)[0].metadata['baz']
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
Fix :func:`dataclasses.field` throwing away empty mapping objects passed as
|
||||
metadata.
|
||||
Loading…
Add table
Add a link
Reference in a new issue