bpo-33805: Improve error message of dataclasses.replace() (GH-7580)

(cherry picked from commit 3d70f7aef6)

Co-authored-by: Dong-hee Na <donghee.na92@gmail.com>
This commit is contained in:
Miss Islington (bot)
2018-06-23 08:04:01 -07:00
committed by GitHub
parent efc6bf66a5
commit bbef7abe92
3 changed files with 20 additions and 0 deletions

View File

@@ -1173,6 +1173,9 @@ def replace(obj, **changes):
continue
if f.name not in changes:
if f._field_type is _FIELD_INITVAR:
raise ValueError(f"InitVar {f.name!r} "
'must be specified with replace()')
changes[f.name] = getattr(obj, f.name)
# Create the new object, which calls __init__() and

View File

@@ -3024,6 +3024,22 @@ class TestReplace(unittest.TestCase):
replace(c, x=5)
def test_initvar_is_specified(self):
@dataclass
class C:
x: int
y: InitVar[int]
def __post_init__(self, y):
self.x *= y
c = C(1, 10)
self.assertEqual(c.x, 10)
with self.assertRaisesRegex(ValueError, r"InitVar 'y' must be "
"specified with replace()"):
replace(c, x=3)
c = replace(c, x=3, y=5)
self.assertEqual(c.x, 15)
## def test_initvar(self):
## @dataclass
## class C:

View File

@@ -0,0 +1 @@
Improve error message of dataclasses.replace() when an InitVar is not specified