From: et-repositories <142979605+et-repositories@users.noreply.github.com> Date: Tue, 19 Mar 2024 14:58:40 +0000 (+0800) Subject: gh-116647: Fix recursive child in dataclasses (#116790) X-Git-Tag: v3.13.0a6~233 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=75935746be0cbd32b9d710b93db9bd49c8d634ba;p=thirdparty%2FPython%2Fcpython.git gh-116647: Fix recursive child in dataclasses (#116790) --- diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index e511eff41250..7db8a4233df8 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -1075,7 +1075,9 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen, cmp_fields = (field for field in field_list if field.compare) terms = [f'self.{field.name}==other.{field.name}' for field in cmp_fields] field_comparisons = ' and '.join(terms) or 'True' - body = [f'if other.__class__ is self.__class__:', + body = [f'if self is other:', + f' return True', + f'if other.__class__ is self.__class__:', f' return {field_comparisons}', f'return NotImplemented'] func = _create_fn('__eq__', diff --git a/Lib/test/test_dataclasses/__init__.py b/Lib/test/test_dataclasses/__init__.py index e27abac51113..832e5672c77d 100644 --- a/Lib/test/test_dataclasses/__init__.py +++ b/Lib/test/test_dataclasses/__init__.py @@ -2471,6 +2471,15 @@ class TestRepr(unittest.TestCase): class TestEq(unittest.TestCase): + def test_recursive_eq(self): + # Test a class with recursive child + @dataclass + class C: + recursive: object = ... + c = C() + c.recursive = c + self.assertEqual(c, c) + def test_no_eq(self): # Test a class with no __eq__ and eq=False. @dataclass(eq=False) diff --git a/Misc/NEWS.d/next/Library/2024-03-14-09-38-51.gh-issue-116647.h0d_zj.rst b/Misc/NEWS.d/next/Library/2024-03-14-09-38-51.gh-issue-116647.h0d_zj.rst new file mode 100644 index 000000000000..081f36bff916 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-03-14-09-38-51.gh-issue-116647.h0d_zj.rst @@ -0,0 +1 @@ +Fix recursive child in dataclasses