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