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

Reply via email to