mirror of
https://github.com/python/cpython.git
synced 2025-08-27 12:16:04 +00:00
bpo-33947: dataclasses no longer can raise RecursionError in repr (GF9916)
The reprlib code was copied here instead of importing reprlib. I'm not sure if we really need to avoid the import, but since I expect dataclasses to be more common that reprlib, it seems wise. Plus, the code is small.
This commit is contained in:
parent
55f8249d65
commit
dd13c88b53
3 changed files with 118 additions and 6 deletions
|
@ -3169,6 +3169,92 @@ class TestReplace(unittest.TestCase):
|
|||
replace(c, x=3)
|
||||
c = replace(c, x=3, y=5)
|
||||
self.assertEqual(c.x, 15)
|
||||
|
||||
def test_recursive_repr(self):
|
||||
@dataclass
|
||||
class C:
|
||||
f: "C"
|
||||
|
||||
c = C(None)
|
||||
c.f = c
|
||||
self.assertEqual(repr(c), "TestReplace.test_recursive_repr.<locals>.C(f=...)")
|
||||
|
||||
def test_recursive_repr_two_attrs(self):
|
||||
@dataclass
|
||||
class C:
|
||||
f: "C"
|
||||
g: "C"
|
||||
|
||||
c = C(None, None)
|
||||
c.f = c
|
||||
c.g = c
|
||||
self.assertEqual(repr(c), "TestReplace.test_recursive_repr_two_attrs"
|
||||
".<locals>.C(f=..., g=...)")
|
||||
|
||||
def test_recursive_repr_indirection(self):
|
||||
@dataclass
|
||||
class C:
|
||||
f: "D"
|
||||
|
||||
@dataclass
|
||||
class D:
|
||||
f: "C"
|
||||
|
||||
c = C(None)
|
||||
d = D(None)
|
||||
c.f = d
|
||||
d.f = c
|
||||
self.assertEqual(repr(c), "TestReplace.test_recursive_repr_indirection"
|
||||
".<locals>.C(f=TestReplace.test_recursive_repr_indirection"
|
||||
".<locals>.D(f=...))")
|
||||
|
||||
def test_recursive_repr_indirection_two(self):
|
||||
@dataclass
|
||||
class C:
|
||||
f: "D"
|
||||
|
||||
@dataclass
|
||||
class D:
|
||||
f: "E"
|
||||
|
||||
@dataclass
|
||||
class E:
|
||||
f: "C"
|
||||
|
||||
c = C(None)
|
||||
d = D(None)
|
||||
e = E(None)
|
||||
c.f = d
|
||||
d.f = e
|
||||
e.f = c
|
||||
self.assertEqual(repr(c), "TestReplace.test_recursive_repr_indirection_two"
|
||||
".<locals>.C(f=TestReplace.test_recursive_repr_indirection_two"
|
||||
".<locals>.D(f=TestReplace.test_recursive_repr_indirection_two"
|
||||
".<locals>.E(f=...)))")
|
||||
|
||||
def test_recursive_repr_two_attrs(self):
|
||||
@dataclass
|
||||
class C:
|
||||
f: "C"
|
||||
g: "C"
|
||||
|
||||
c = C(None, None)
|
||||
c.f = c
|
||||
c.g = c
|
||||
self.assertEqual(repr(c), "TestReplace.test_recursive_repr_two_attrs"
|
||||
".<locals>.C(f=..., g=...)")
|
||||
|
||||
def test_recursive_repr_misc_attrs(self):
|
||||
@dataclass
|
||||
class C:
|
||||
f: "C"
|
||||
g: int
|
||||
|
||||
c = C(None, 1)
|
||||
c.f = c
|
||||
self.assertEqual(repr(c), "TestReplace.test_recursive_repr_misc_attrs"
|
||||
".<locals>.C(f=..., g=1)")
|
||||
|
||||
## def test_initvar(self):
|
||||
## @dataclass
|
||||
## class C:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue