Author: Armin Rigo <ar...@tunes.org>
Branch: py3.5
Changeset: r91841:94b78e58b886
Date: 2017-07-08 17:04 +0200
http://bitbucket.org/pypy/pypy/changeset/94b78e58b886/

Log:    hg merge default

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
@@ -317,9 +317,9 @@
 
     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")
+                        "argument to reversed() must be a sequence")
         self.w_sequence = w_sequence
 
     @staticmethod
@@ -328,9 +328,6 @@
         if w_reversed_descr is not None:
             w_reversed = space.get(w_reversed_descr, w_sequence)
             return space.call_function(w_reversed)
-        if not space.issequence_w(w_sequence):
-            raise oefmt(space.w_TypeError,
-                        "argument to reversed() must be a sequence")
         self = space.allocate_instance(W_ReversedIterator, w_subtype)
         self.__init__(space, w_sequence)
         return self
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
@@ -527,8 +527,24 @@
         assert list(reversed(list(reversed("hello")))) == ['h','e','l','l','o']
         raises(TypeError, reversed, reversed("hello"))
 
-    def test_reversed_nonsequence(self):
+    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())
 
     def test_reversed_length_hint(self):
         lst = [1, 2, 3]
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to