mirror of
https://github.com/python/cpython.git
synced 2025-07-29 14:15:07 +00:00
bpo-36470: Allow dataclasses.replace() to handle InitVars with default values (GH-20867) (GH-25200)
Co-Authored-By: Claudiu Popa <pcmanticore@gmail.com>
Automerge-Triggered-By: GH:ericvsmith
(cherry picked from commit 75220674c0
)
Co-authored-by: Zackery Spytz <zspytz@gmail.com>
Co-authored-by: Zackery Spytz <zspytz@gmail.com>
This commit is contained in:
parent
82cd24a03c
commit
013c30e5fc
3 changed files with 21 additions and 1 deletions
|
@ -1271,7 +1271,7 @@ def replace(obj, /, **changes):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if f.name not in changes:
|
if f.name not in changes:
|
||||||
if f._field_type is _FIELD_INITVAR:
|
if f._field_type is _FIELD_INITVAR and f.default is MISSING:
|
||||||
raise ValueError(f"InitVar {f.name!r} "
|
raise ValueError(f"InitVar {f.name!r} "
|
||||||
'must be specified with replace()')
|
'must be specified with replace()')
|
||||||
changes[f.name] = getattr(obj, f.name)
|
changes[f.name] = getattr(obj, f.name)
|
||||||
|
|
|
@ -3245,6 +3245,24 @@ class TestReplace(unittest.TestCase):
|
||||||
c = replace(c, x=3, y=5)
|
c = replace(c, x=3, y=5)
|
||||||
self.assertEqual(c.x, 15)
|
self.assertEqual(c.x, 15)
|
||||||
|
|
||||||
|
def test_initvar_with_default_value(self):
|
||||||
|
@dataclass
|
||||||
|
class C:
|
||||||
|
x: int
|
||||||
|
y: InitVar[int] = None
|
||||||
|
z: InitVar[int] = 42
|
||||||
|
|
||||||
|
def __post_init__(self, y, z):
|
||||||
|
if y is not None:
|
||||||
|
self.x += y
|
||||||
|
if z is not None:
|
||||||
|
self.x += z
|
||||||
|
|
||||||
|
c = C(x=1, y=10, z=1)
|
||||||
|
self.assertEqual(replace(c), C(x=12))
|
||||||
|
self.assertEqual(replace(c, y=4), C(x=12, y=4, z=42))
|
||||||
|
self.assertEqual(replace(c, y=4, z=1), C(x=12, y=4, z=1))
|
||||||
|
|
||||||
def test_recursive_repr(self):
|
def test_recursive_repr(self):
|
||||||
@dataclass
|
@dataclass
|
||||||
class C:
|
class C:
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix dataclasses with ``InitVar``\s and :func:`~dataclasses.replace()`. Patch
|
||||||
|
by Claudiu Popa.
|
Loading…
Add table
Add a link
Reference in a new issue