summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoret-repositories <142979605+et-repositories@users.noreply.github.com>2024-03-19 14:58:40 (GMT)
committerGitHub <noreply@github.com>2024-03-19 14:58:40 (GMT)
commit75935746be0cbd32b9d710b93db9bd49c8d634ba (patch)
tree9d1f9c96881c97d9f2458d1cfe249f841e13f3a2
parent3cac2af5ecfa9e2a47bfdd15e114b65780836b9d (diff)
downloadcpython-75935746be0cbd32b9d710b93db9bd49c8d634ba.zip
cpython-75935746be0cbd32b9d710b93db9bd49c8d634ba.tar.gz
cpython-75935746be0cbd32b9d710b93db9bd49c8d634ba.tar.bz2
gh-116647: Fix recursive child in dataclasses (#116790)
-rw-r--r--Lib/dataclasses.py4
-rw-r--r--Lib/test/test_dataclasses/__init__.py9
-rw-r--r--Misc/NEWS.d/next/Library/2024-03-14-09-38-51.gh-issue-116647.h0d_zj.rst1
3 files changed, 13 insertions, 1 deletions
diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py
index e511eff..7db8a42 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 e27abac..832e567 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 0000000..081f36b
--- /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