diff options
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/dataclasses.py | 2 | ||||
-rw-r--r-- | Lib/test/test_dataclasses.py | 18 |
2 files changed, 19 insertions, 1 deletions
diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 422a95cebe..3de2ec04ad 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -1300,7 +1300,7 @@ def replace(obj, /, **changes): continue 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} " 'must be specified with replace()') changes[f.name] = getattr(obj, f.name) diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index 0bfed41b36..4f5c3c8aab 100644 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -3251,6 +3251,24 @@ class TestReplace(unittest.TestCase): c = replace(c, x=3, y=5) 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): @dataclass class C: |