[pypy-commit] pypy speedup-unpackiterable: add itertools.repeat.__len__

fijal noreply at buildbot.pypy.org
Fri Jul 13 00:59:53 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: speedup-unpackiterable
Changeset: r56049:ddb50e25e3e9
Date: 2012-07-13 00:59 +0200
http://bitbucket.org/pypy/pypy/changeset/ddb50e25e3e9/

Log:	add itertools.repeat.__len__

diff --git a/pypy/module/itertools/interp_itertools.py b/pypy/module/itertools/interp_itertools.py
--- a/pypy/module/itertools/interp_itertools.py
+++ b/pypy/module/itertools/interp_itertools.py
@@ -112,6 +112,11 @@
             s = 'repeat(%s)' % (objrepr,)
         return self.space.wrap(s)
 
+    def len(self, space):
+        if self.count == -1 or not self.counting:
+            raise OperationError(space.w_TypeError, space.wrap('len() of unsized object'))
+        return space.wrap(self.count)
+
 def W_Repeat___new__(space, w_subtype, w_object, w_times=None):
     r = space.allocate_instance(W_Repeat, w_subtype)
     r.__init__(space, w_object, w_times)
@@ -124,6 +129,7 @@
         __iter__ = interp2app(W_Repeat.iter_w),
         next     = interp2app(W_Repeat.next_w),
         __repr__ = interp2app(W_Repeat.repr_w),
+        __len__  = interp2app(W_Repeat.len),
         __doc__  = """Make an iterator that returns object over and over again.
     Runs indefinitely unless the times argument is specified.  Used
     as argument to imap() for invariant parameters to the called
diff --git a/pypy/module/itertools/test/test_itertools.py b/pypy/module/itertools/test/test_itertools.py
--- a/pypy/module/itertools/test/test_itertools.py
+++ b/pypy/module/itertools/test/test_itertools.py
@@ -88,6 +88,14 @@
         list(it)
         assert repr(it) == "repeat('foobar', 0)"
 
+    def test_repeat_len(self):
+        import itertools
+
+        r = itertools.repeat('a', 15)
+        r.next()
+        assert len(r) == 14
+        raises(TypeError, "len(itertools.repeat('xkcd'))")
+
     def test_takewhile(self):
         import itertools
 


More information about the pypy-commit mailing list