New submission from Eric V. Smith <e...@trueblade.com>:
If a dataclass contains an InitVar without a default value, that InitVar must be specified in the call to replace(). This is because replace() works by first creating a new object, and InitVars without defaults, by definition, must be specified when creating the object. There is no other source for the value of the InitVar to use. However, the exception you get is confusing: >>> from dataclasses import * >>> @dataclass ... class C: ... i: int ... j: InitVar[int] ... >>> c = C(1, 2) >>> replace(c, i=3) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\home\eric\local\python\cpython\lib\dataclasses.py", line 1176, in replace changes[f.name] = getattr(obj, f.name) AttributeError: 'C' object has no attribute 'j' >>> This message really should say something like "InitVar 'j' must be specified". ---------- assignee: eric.smith components: Library (Lib) messages: 319036 nosy: eric.smith priority: normal severity: normal status: open title: dataclasses: replace() give poor error message if using InitVar type: behavior versions: Python 3.7, Python 3.8 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue33805> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com