[pypy-commit] pypy py3.6: hg merge default

rlamy pypy.commits at gmail.com
Tue Aug 20 15:48:37 EDT 2019


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: py3.6
Changeset: r97229:aa1858313621
Date: 2019-08-20 20:47 +0100
http://bitbucket.org/pypy/pypy/changeset/aa1858313621/

Log:	hg merge default

diff --git a/pypy/objspace/std/dictmultiobject.py b/pypy/objspace/std/dictmultiobject.py
--- a/pypy/objspace/std/dictmultiobject.py
+++ b/pypy/objspace/std/dictmultiobject.py
@@ -381,9 +381,23 @@
                 del currently_in_repr[d]
             except:
                 pass
+
+    def viewrepr(currently_in_repr, view):
+        if view in currently_in_repr:
+            return '...'
+        currently_in_repr[view] = 1
+        try:
+            return (type(view).__name__ + "([" +
+               ", ".join([repr(x) for x in view]) + '])')
+        finally:
+            try:
+                del currently_in_repr[view]
+            except:
+                pass
 ''', filename=__file__)
 
 dictrepr = app.interphook("dictrepr")
+viewrepr = app.interphook("viewrepr")
 
 
 W_DictMultiObject.typedef = TypeDef("dict",
@@ -1431,10 +1445,7 @@
         self.w_dict = w_dict
 
     def descr_repr(self, space):
-        typename = space.type(self).getname(space)
-        w_seq = space.call_function(space.w_list, self)
-        seq_repr = space.utf8_w(space.repr(w_seq))
-        return space.newtext("%s(%s)" % (typename, seq_repr))
+        return viewrepr(space, space.get_objects_in_repr(), self)
 
     def descr_len(self, space):
         return space.len(self.w_dict)
diff --git a/pypy/objspace/std/test/test_dictmultiobject.py b/pypy/objspace/std/test/test_dictmultiobject.py
--- a/pypy/objspace/std/test/test_dictmultiobject.py
+++ b/pypy/objspace/std/test/test_dictmultiobject.py
@@ -895,6 +895,11 @@
         d = {'日本': '日本国'}
         assert repr(d.items()) == "dict_items([('日本', '日本国')])"
 
+    def test_recursive_repr(self):
+        d = {1: 2}
+        d[2] = d.values()
+        assert repr(d) == '{1: 2, 2: dict_values([2, ...])}'
+
     def test_keys_set_operations(self):
         d1 = {'a': 1, 'b': 2}
         d2 = {'b': 3, 'c': 2}


More information about the pypy-commit mailing list