[pypy-commit] pypy length-hint: another __length_hint__ impl for the generic reversed
pjenvey
noreply at buildbot.pypy.org
Sun Oct 7 20:41:56 CEST 2012
Author: Philip Jenvey <pjenvey at underboss.org>
Branch: length-hint
Changeset: r57859:ad1264e5637a
Date: 2012-10-07 11:40 -0700
http://bitbucket.org/pypy/pypy/changeset/ad1264e5637a/
Log: another __length_hint__ impl for the generic reversed
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
@@ -270,6 +270,9 @@
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_next(self, space):
if self.remaining >= 0:
w_index = space.wrap(self.remaining)
@@ -296,9 +299,10 @@
return space.newtuple([w_new_inst, w_info])
W_ReversedIterator.typedef = TypeDef("reversed",
- __iter__=interp2app(W_ReversedIterator.descr___iter__),
- next=interp2app(W_ReversedIterator.descr_next),
- __reduce__=interp2app(W_ReversedIterator.descr___reduce__),
+ __iter__ = interp2app(W_ReversedIterator.descr___iter__),
+ __length_hint__ = interp2app(W_ReversedIterator.descr_length),
+ next = interp2app(W_ReversedIterator.descr_next),
+ __reduce__ = interp2app(W_ReversedIterator.descr___reduce__),
)
# exported through _pickle_support
diff --git a/pypy/objspace/std/test/test_lengthhint.py b/pypy/objspace/std/test/test_lengthhint.py
--- a/pypy/objspace/std/test/test_lengthhint.py
+++ b/pypy/objspace/std/test/test_lengthhint.py
@@ -65,6 +65,24 @@
self._test_length_hint(self.space.newtuple(self.ITEMS))
def test_reversed(self):
+ # test the generic reversed iterator (w_foo lacks __reversed__)
+ space = self.space
+ w_foo = space.appexec([], """():
+ class Foo(object):
+ def __len__(self):
+ return %r
+ def __getitem__(self, index):
+ if 0 <= index < %r:
+ return index
+ raise IndexError()
+ return Foo()
+ """ % (self.SIZE, self.SIZE))
+ w_reversed = space.call_method(space.builtin, 'reversed', w_foo)
+ assert space.int_w(
+ space.call_method(w_reversed, '__length_hint__')) == self.SIZE
+ self._test_length_hint(w_reversed)
+
+ def test_reversedsequenceiterator(self):
space = self.space
w_reversed = space.call_method(space.builtin, 'reversed',
space.wrap(self.ITEMS))
More information about the pypy-commit
mailing list