Author: Armin Rigo <[email protected]>
Branch: py3.5
Changeset: r88021:f9dfa88ad22a
Date: 2016-11-01 11:36 +0100
http://bitbucket.org/pypy/pypy/changeset/f9dfa88ad22a/
Log: Test and fix
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
@@ -335,8 +335,16 @@
def descr___iter__(self, space):
return space.wrap(self)
- def descr_length(self, space):
- return space.wrap(0 if self.remaining == -1 else self.remaining + 1)
+ def descr_length_hint(self, space):
+ # bah, there is even a CPython test that checks that this
+ # actually calls 'len_w(w_sequence)'. Obscure.
+ res = 0
+ if self.remaining >= 0:
+ total_length = space.len_w(self.w_sequence)
+ rem_length = self.remaining + 1
+ if rem_length <= total_length:
+ res = rem_length
+ return space.wrap(res)
def descr_next(self, space):
if self.remaining >= 0:
@@ -383,7 +391,7 @@
W_ReversedIterator.typedef = TypeDef("reversed",
__new__ = interp2app(W_ReversedIterator.descr___new__2),
__iter__ = interp2app(W_ReversedIterator.descr___iter__),
- __length_hint__ = interp2app(W_ReversedIterator.descr_length),
+ __length_hint__ = interp2app(W_ReversedIterator.descr_length_hint),
__next__ = interp2app(W_ReversedIterator.descr_next),
__reduce__ = interp2app(W_ReversedIterator.descr___reduce__),
__setstate__ = interp2app(W_ReversedIterator.descr___setstate__),
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,6 +527,25 @@
assert list(reversed(list(reversed("hello")))) == ['h','e','l','l','o']
raises(TypeError, reversed, reversed("hello"))
+ def test_reversed_length_hint(self):
+ lst = [1, 2, 3]
+ r = reversed(lst)
+ assert r.__length_hint__() == 3
+ assert next(r) == 3
+ assert r.__length_hint__() == 2
+ lst.pop()
+ assert r.__length_hint__() == 2
+ lst.pop()
+ assert r.__length_hint__() == 0
+ raises(StopIteration, next, r)
+ #
+ r = reversed(lst)
+ assert r.__length_hint__() == 1
+ assert next(r) == 1
+ assert r.__length_hint__() == 0
+ raises(StopIteration, next, r)
+ assert r.__length_hint__() == 0
+
class AppTestAllAny:
"""
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit