Skip to content

Commit 284ab95

Browse files
committed
Handle recursive repr in SimpleNamespace
1 parent 42ef03a commit 284ab95

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_types.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_nested
5050
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_pickle
5151
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_recursive
52+
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_recursive_repr
5253
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_repr
5354
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_subclass
5455
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_unbound

graalpython/lib-graalpython/_descriptor.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,39 @@ def func(self):
7575
return named_tuple
7676

7777

78+
def recursive_repr(fillfn):
79+
def inner(fn):
80+
data = None
81+
82+
def wrapper(self):
83+
nonlocal data
84+
if data is None:
85+
# lazy initialization to avoid bootstrap issues
86+
import threading
87+
data = threading.local()
88+
data.running = set()
89+
key = id(self)
90+
if key in data.running:
91+
return fillfn(self)
92+
data.running.add(key)
93+
try:
94+
result = fn(self)
95+
finally:
96+
data.running.discard(key)
97+
return result
98+
99+
wrapper.__name__ = fn.__name__
100+
wrapper.__qualname__ = fn.__qualname__
101+
return wrapper
102+
return inner
103+
104+
78105
class SimpleNamespace(object):
79106
def __init__(self, **kwargs):
80107
for k, v in kwargs.items():
81108
setattr(self, k, v)
82109

110+
@recursive_repr(lambda self: "%s(...)" % 'namespace' if type(self) is SimpleNamespace else type(self).__name__)
83111
def __repr__(self):
84112
sb = []
85113
for k, v in sorted(self.__dict__.items()):

0 commit comments

Comments
 (0)