Home > Back-end >  How to compare dataclasses?
How to compare dataclasses?

Time:10-10

I would like to compare two global dataclasses in terms of equality. I changed the field in one of the dataclasses and python still insists on telling me, that those objects are equal. I don't know how internally dataclasses work, but when I print asdict I get an empty dictionary... What am I doing wrong and how can I compare dataclasses by checking for equality of its members?

I'm using Python 3.9.4

from dataclasses import dataclass, asdict

@dataclass
class TestClass:
    field1 = None
    field2 = False

test1 = TestClass()
test2 = TestClass()

def main():
    global test1
    global test2

    test2.field2 = True

    print('Test1:        ', id(test1), asdict(test1), test1.field1, test1.field2)
    print('Test2:        ', id(test2), asdict(test2), test2.field1, test2.field2)
    print('Are equal?    ', test1 == test2)
    print('Are not equal?', test1 != test2)

if __name__ == '__main__':
    main()

Output:

Test1:         2017289121504 {} None False
Test2:         2017289119296 {} None True
Are equal?     True
Are not equal? False

CodePudding user response:

For Python to recognize fields of a dataclass, those fields should have PEP 526 type annotations.

For example:

from typing import Optional

@dataclass
class TestClass:
    field1: Optional[str] = None
    field2: bool = False

With that definition comparisons and asdict work as expected:

In [2]: TestClass(field2=True) == TestClass()
Out[2]: False

In [3]: asdict(TestClass(field2=True))
Out[3]: {'field1': None, 'field2': True}
  • Related