Skip to content

Commit 7593574

Browse files
author
et-repositories
authored
gh-116647: Fix recursive child in dataclasses (#116790)
1 parent 3cac2af commit 7593574

File tree

3 files changed

+13
-1
lines changed

3 files changed

+13
-1
lines changed

Lib/dataclasses.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -1075,7 +1075,9 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen,
10751075
cmp_fields = (field for field in field_list if field.compare)
10761076
terms = [f'self.{field.name}==other.{field.name}' for field in cmp_fields]
10771077
field_comparisons = ' and '.join(terms) or 'True'
1078-
body = [f'if other.__class__ is self.__class__:',
1078+
body = [f'if self is other:',
1079+
f' return True',
1080+
f'if other.__class__ is self.__class__:',
10791081
f' return {field_comparisons}',
10801082
f'return NotImplemented']
10811083
func = _create_fn('__eq__',

Lib/test/test_dataclasses/__init__.py

+9
Original file line numberDiff line numberDiff line change
@@ -2471,6 +2471,15 @@ def __repr__(self):
24712471

24722472

24732473
class TestEq(unittest.TestCase):
2474+
def test_recursive_eq(self):
2475+
# Test a class with recursive child
2476+
@dataclass
2477+
class C:
2478+
recursive: object = ...
2479+
c = C()
2480+
c.recursive = c
2481+
self.assertEqual(c, c)
2482+
24742483
def test_no_eq(self):
24752484
# Test a class with no __eq__ and eq=False.
24762485
@dataclass(eq=False)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix recursive child in dataclasses

0 commit comments

Comments
 (0)