Author: Ronan Lamy <ronan.l...@gmail.com>
Branch: py3.5
Changeset: r95730:4674aa2581e3
Date: 2019-01-26 20:12 +0000
http://bitbucket.org/pypy/pypy/changeset/4674aa2581e3/

Log:    Fix reversed() on OrderedDict views

diff --git a/lib_pypy/_pypy_collections.py b/lib_pypy/_pypy_collections.py
--- a/lib_pypy/_pypy_collections.py
+++ b/lib_pypy/_pypy_collections.py
@@ -137,14 +137,14 @@
 
 class _OrderedDictKeysView(dict_keys):
     def __reversed__(self):
-        yield from reversed_dict(self._mapping)
+        yield from reversed_dict(self._dict)
 
 class _OrderedDictItemsView(dict_items):
     def __reversed__(self):
-        for key in reversed_dict(self._mapping):
-            yield (key, self._mapping[key])
+        for key in reversed_dict(self._dict):
+            yield (key, self._dict[key])
 
 class _OrderedDictValuesView(dict_values):
     def __reversed__(self):
-        for key in reversed_dict(self._mapping):
-            yield self._mapping[key]
+        for key in reversed_dict(self._dict):
+            yield self._dict[key]
diff --git a/pypy/module/_collections/test/test_ordereddict.py 
b/pypy/module/_collections/test/test_ordereddict.py
--- a/pypy/module/_collections/test/test_ordereddict.py
+++ b/pypy/module/_collections/test/test_ordereddict.py
@@ -22,3 +22,17 @@
         assert d['x'] == 42
         d.update({'y': 2})
         assert d['y'] == 42
+
+    def test_reversed(self):
+        import sys
+        from _collections import OrderedDict
+
+        pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
+        od = OrderedDict(pairs)
+        if '__pypy__' in sys.builtin_module_names:
+            # dict ordering is wrong when testing interpreted on top of CPython
+            pairs = list(dict(od).items())
+        assert list(reversed(od)) == [t[0] for t in reversed(pairs)]
+        assert list(reversed(od.keys())) == [t[0] for t in reversed(pairs)]
+        assert list(reversed(od.values())) == [t[1] for t in reversed(pairs)]
+        assert list(reversed(od.items())) == list(reversed(pairs))
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
@@ -11,7 +11,7 @@
     WrappedDefault, applevel, interp2app, unwrap_spec)
 from pypy.interpreter.mixedmodule import MixedModule
 from pypy.interpreter.signature import Signature
-from pypy.interpreter.typedef import TypeDef
+from pypy.interpreter.typedef import TypeDef, interp_attrproperty_w
 from pypy.interpreter.unicodehelper import decode_utf8
 from pypy.objspace.std.util import negate
 
@@ -1610,6 +1610,7 @@
     __xor__ = interp2app(W_DictViewItemsObject.descr_xor),
     __rxor__ = interp2app(W_DictViewItemsObject.descr_rxor),
     isdisjoint = interp2app(W_DictViewItemsObject.descr_isdisjoint),
+    _dict = interp_attrproperty_w('w_dict', cls=W_DictViewItemsObject),
     )
 
 W_DictViewKeysObject.typedef = TypeDef(
@@ -1636,6 +1637,7 @@
     __xor__ = interp2app(W_DictViewKeysObject.descr_xor),
     __rxor__ = interp2app(W_DictViewKeysObject.descr_rxor),
     isdisjoint = interp2app(W_DictViewKeysObject.descr_isdisjoint),
+    _dict = interp_attrproperty_w('w_dict', cls=W_DictViewKeysObject),
     )
 
 W_DictViewValuesObject.typedef = TypeDef(
@@ -1644,4 +1646,5 @@
     __repr__ = interp2app(W_DictViewValuesObject.descr_repr),
     __len__ = interp2app(W_DictViewValuesObject.descr_len),
     __iter__ = interp2app(W_DictViewValuesObject.descr_iter),
+    _dict = interp_attrproperty_w('w_dict', cls=W_DictViewValuesObject),
     )
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to