This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author xtreak
Recipients colin-b, eric.smith, xtreak
Date 2019-07-02.15:18:04
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1562080684.82.0.753110013319.issue37485@roundup.psfhosted.org>
In-reply-to
Content
https://docs.python.org/3/library/dataclasses.html#inheritance

> When the dataclass is being created by the dataclass() decorator, it looks through all of the class’s base classes in reverse MRO (that is, starting at object) and, for each dataclass that it finds, adds the fields from that base class to an ordered mapping of fields. After all of the base class fields are added, it adds its own fields to the ordered mapping. All of the generated methods will use this combined, calculated ordered mapping of fields. Because the fields are in insertion order, derived classes override base classes.

I think here in the example __eq__ is defined in A and is inherited by B but since eq=False is not explicitly defined in the decorator the dataclass will use it's own definition of eq and override it at [0] . So using eq=False will work as expected. I propose closing this as not a bug. 


import dataclasses


@dataclasses.dataclass
class A:
    def __eq__(self, other):
        return True


@dataclasses.dataclass(eq=False) # By default eq=True
class B(A):
    pass


print(A() == 1) # Returns True as expected
print(B() == 1) # Returns True since inherited A.__eq__ is not overriden with eq=False


Output

./python.exe ../backups/bpo37485.py
True
True

[0] https://github.com/python/cpython/blob/7cb9204ee1cf204f6f507d99a60f7c5bb359eebb/Lib/dataclasses.py#L922
History
Date User Action Args
2019-07-02 15:18:04xtreaksetrecipients: + xtreak, eric.smith, colin-b
2019-07-02 15:18:04xtreaksetmessageid: <1562080684.82.0.753110013319.issue37485@roundup.psfhosted.org>
2019-07-02 15:18:04xtreaklinkissue37485 messages
2019-07-02 15:18:04xtreakcreate