dataclass overriding a property in the parent class is broken
Open
@sobolevn is already working on this.
Since Jul 4, 2024.
stdlib
topic-dataclasses
type-bug
- Dominant language
- Python
- Stars
- 77.2k
- Forks
- 35.9k
- PR merge metrics
- PR metrics pending
Description
Bug report
Bug description:
Consider the following snippet
@dc.dataclass
class A:
a: int
@property
def b(self) -> int:
return 1
@dc.dataclass
class B(A):
b: int = dc.field(default_factory=lambda: 0)
Dataclass apparently doesn't create a class attribute, so class B ends up with property , b of class A, which seems surprising, especially given that there is explicit assignent of field b in class B(A).
So this results in:
>>> B.b
<property object at ...>
>>> B(a=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 4, in __init__
AttributeError: property 'b' of 'B' object has no setter
If i replace definition of b like so b: int = dc.field(default=0), or with b: int = 0 then everything works as expected:
>>> B.b
0
>>> B(a=2)
B(a=2, b=0)
I think it would be nice if dataclass would always create a class attribute (especially if there is explicit assignment!)
so that overloads work as expected.
CPython versions tested on:
3.11, 3.12
Operating systems tested on:
Linux
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.