Author: Armin Rigo <[email protected]>
Branch:
Changeset: r91838:016c02447548
Date: 2017-07-08 16:57 +0200
http://bitbucket.org/pypy/pypy/changeset/016c02447548/
Log: issue #2601
Fix for 'reversed(mapping object)'
diff --git a/pypy/module/__builtin__/functional.py
b/pypy/module/__builtin__/functional.py
--- a/pypy/module/__builtin__/functional.py
+++ b/pypy/module/__builtin__/functional.py
@@ -346,7 +346,7 @@
class W_ReversedIterator(W_Root):
def __init__(self, space, w_sequence):
self.remaining = space.len_w(w_sequence) - 1
- if space.lookup(w_sequence, "__getitem__") is None:
+ if not space.issequence_w(w_sequence):
raise oefmt(space.w_TypeError,
"reversed() argument must be a sequence")
self.w_sequence = w_sequence
diff --git a/pypy/module/__builtin__/test/test_functional.py
b/pypy/module/__builtin__/test/test_functional.py
--- a/pypy/module/__builtin__/test/test_functional.py
+++ b/pypy/module/__builtin__/test/test_functional.py
@@ -227,6 +227,25 @@
assert list(reversed(list(reversed("hello")))) == ['h','e','l','l','o']
raises(TypeError, reversed, reversed("hello"))
+ def test_reversed_user_type(self):
+ class X(object):
+ def __getitem__(self, index):
+ return str(index)
+ def __len__(self):
+ return 5
+ assert list(reversed(X())) == ["4", "3", "2", "1", "0"]
+
+ def test_reversed_not_for_mapping(self):
+ raises(TypeError, reversed, {})
+ raises(TypeError, reversed, {2: 3})
+ assert not hasattr(dict, '__reversed__')
+
+ def test_reversed_type_with_no_len(self):
+ class X(object):
+ def __getitem__(self, key):
+ raise ValueError
+ raises(TypeError, reversed, X())
+
class AppTestApply:
def test_apply(self):
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
@@ -236,10 +236,6 @@
"an internal 'del' on the dictionary failed to find "
"the key")
- def descr_reversed(self, space):
- raise oefmt(space.w_TypeError,
- "argument to reversed() must be a sequence")
-
def descr_copy(self, space):
"""D.copy() -> a shallow copy of D"""
w_new = W_DictMultiObject.allocate_and_init_instance(space)
@@ -517,7 +513,6 @@
__setitem__ = interp2app(W_DictMultiObject.descr_setitem),
__delitem__ = interp2app(W_DictMultiObject.descr_delitem),
- __reversed__ = interp2app(W_DictMultiObject.descr_reversed),
copy = interp2app(W_DictMultiObject.descr_copy),
items = interp2app(W_DictMultiObject.descr_items),
keys = interp2app(W_DictMultiObject.descr_keys),
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit