[pypy-svn] r58995 - in pypy/trunk/pypy: module/__builtin__ module/__builtin__/test objspace/std objspace/std/test

arigo at codespeak.net arigo at codespeak.net
Sat Oct 11 18:33:39 CEST 2008


Author: arigo
Date: Sat Oct 11 18:33:38 2008
New Revision: 58995

Modified:
   pypy/trunk/pypy/module/__builtin__/app_functional.py
   pypy/trunk/pypy/module/__builtin__/functional.py
   pypy/trunk/pypy/module/__builtin__/test/test_functional.py
   pypy/trunk/pypy/objspace/std/dictmultiobject.py
   pypy/trunk/pypy/objspace/std/dictobject.py
   pypy/trunk/pypy/objspace/std/iterobject.py
   pypy/trunk/pypy/objspace/std/rangeobject.py
   pypy/trunk/pypy/objspace/std/ropeobject.py
   pypy/trunk/pypy/objspace/std/ropeunicodeobject.py
   pypy/trunk/pypy/objspace/std/setobject.py
   pypy/trunk/pypy/objspace/std/test/test_dictobject.py
   pypy/trunk/pypy/objspace/std/test/test_iterobject.py
   pypy/trunk/pypy/objspace/std/test/test_rangeobject.py
   pypy/trunk/pypy/objspace/std/test/test_stringobject.py
   pypy/trunk/pypy/objspace/std/test/test_unicodeobject.py
Log:
Following CPython 2.5, remove __len__ on all iterator types.
This should be reintroduced as __length_hint__ methods at
some point; that's why I only commented the code out.


Modified: pypy/trunk/pypy/module/__builtin__/app_functional.py
==============================================================================
--- pypy/trunk/pypy/module/__builtin__/app_functional.py	(original)
+++ pypy/trunk/pypy/module/__builtin__/app_functional.py	Sat Oct 11 18:33:38 2008
@@ -317,10 +317,11 @@
             return item
         raise StopIteration
 
-    def __len__(self):
-        if self.remaining > len(self.seq):
-            self.remaining = 0
-        return self.remaining
+# XXX __length_hint__()
+##    def __len__(self):
+##        if self.remaining > len(self.seq):
+##            self.remaining = 0
+##        return self.remaining
 
     def __reduce__(self):
         tup = (self.seq, self.remaining)

Modified: pypy/trunk/pypy/module/__builtin__/functional.py
==============================================================================
--- pypy/trunk/pypy/module/__builtin__/functional.py	(original)
+++ pypy/trunk/pypy/module/__builtin__/functional.py	Sat Oct 11 18:33:38 2008
@@ -259,7 +259,8 @@
 
 W_XRangeIterator.typedef = TypeDef("rangeiterator",
     __iter__        = interp2app(W_XRangeIterator.descr_iter),
-    __len__         = interp2app(W_XRangeIterator.descr_len),
+# XXX __length_hint__()
+##    __len__         = interp2app(W_XRangeIterator.descr_len),
     next            = interp2app(W_XRangeIterator.descr_next),
     __reduce__      = interp2app(W_XRangeIterator.descr_reduce),
 )

Modified: pypy/trunk/pypy/module/__builtin__/test/test_functional.py
==============================================================================
--- pypy/trunk/pypy/module/__builtin__/test/test_functional.py	(original)
+++ pypy/trunk/pypy/module/__builtin__/test/test_functional.py	Sat Oct 11 18:33:38 2008
@@ -110,15 +110,10 @@
       x = xrange(2, 9, 3)
       it = iter(x)
       assert iter(it) is it
-      assert len(it) == 3
       assert it.next() == 2
-      assert len(it) == 2
       assert it.next() == 5
-      assert len(it) == 1
       assert it.next() == 8
-      assert len(it) == 0
       raises(StopIteration, it.next)
-      assert len(it) == 0
       # test again, to make sure that xrange() is not its own iterator
       assert iter(x).next() == 2
 
@@ -126,16 +121,12 @@
    def test_reversed(self):
       r = reversed("hello")
       assert iter(r) is r
-      assert len(r) == 5
       assert r.next() == "o"
       assert r.next() == "l"
       assert r.next() == "l"
       assert r.next() == "e"
-      assert len(r) == 1
       assert r.next() == "h"
-      assert len(r) == 0
       raises(StopIteration, r.next)
-      assert len(r) == 0
       assert list(reversed(list(reversed("hello")))) == ['h','e','l','l','o']
       raises(TypeError, reversed, reversed("hello"))
 

Modified: pypy/trunk/pypy/objspace/std/dictmultiobject.py
==============================================================================
--- pypy/trunk/pypy/objspace/std/dictmultiobject.py	(original)
+++ pypy/trunk/pypy/objspace/std/dictmultiobject.py	Sat Oct 11 18:33:38 2008
@@ -1294,9 +1294,10 @@
         return w_result
     raise OperationError(space.w_StopIteration, space.w_None)
 
-def len__DictMultiIterObject(space, w_dictiter):
-    iteratorimplementation = w_dictiter.iteratorimplementation
-    return space.wrap(iteratorimplementation.length())
+# XXX __length_hint__()
+##def len__DictMultiIterObject(space, w_dictiter):
+##    iteratorimplementation = w_dictiter.iteratorimplementation
+##    return space.wrap(iteratorimplementation.length())
 
 # ____________________________________________________________
 

Modified: pypy/trunk/pypy/objspace/std/dictobject.py
==============================================================================
--- pypy/trunk/pypy/objspace/std/dictobject.py	(original)
+++ pypy/trunk/pypy/objspace/std/dictobject.py	Sat Oct 11 18:33:38 2008
@@ -234,7 +234,7 @@
         w_self.space = space
         w_self.content = content = w_dictobject.content
         w_self.len = len(content)
-        w_self.pos = 0
+        w_self.pos = 0    # XXX only for dicttype.descr_dictiter__reduce__()
         w_self.setup_iterator()
     
     def setup_iterator(w_self):
@@ -300,11 +300,12 @@
         w_dictiter.content = None
     raise OperationError(space.w_StopIteration, space.w_None)
 
-def len__DictIterObject(space, w_dictiter):
-    content = w_dictiter.content
-    if content is None or w_dictiter.len == -1:
-        return space.wrap(0)
-    return space.wrap(w_dictiter.len - w_dictiter.pos)
+# XXX __length_hint__()
+##def len__DictIterObject(space, w_dictiter):
+##    content = w_dictiter.content
+##    if content is None or w_dictiter.len == -1:
+##        return space.wrap(0)
+##    return space.wrap(w_dictiter.len - w_dictiter.pos)
 
 # ____________________________________________________________
 

Modified: pypy/trunk/pypy/objspace/std/iterobject.py
==============================================================================
--- pypy/trunk/pypy/objspace/std/iterobject.py	(original)
+++ pypy/trunk/pypy/objspace/std/iterobject.py	Sat Oct 11 18:33:38 2008
@@ -75,8 +75,9 @@
     w_seqiter.index += 1 
     return w_item
 
-def len__SeqIter(space,  w_seqiter):
-    return w_seqiter.getlength(space)
+# XXX __length_hint__()
+##def len__SeqIter(space,  w_seqiter):
+##    return w_seqiter.getlength(space)
 
 
 def iter__FastTupleIter(space, w_seqiter):
@@ -95,8 +96,9 @@
     w_seqiter.index = index + 1
     return w_item
 
-def len__FastTupleIter(space, w_seqiter):
-    return w_seqiter.getlength(space)
+# XXX __length_hint__()
+##def len__FastTupleIter(space, w_seqiter):
+##    return w_seqiter.getlength(space)
 
 
 def iter__FastListIter(space, w_seqiter):
@@ -115,8 +117,9 @@
     w_seqiter.index = index + 1
     return w_item
 
-def len__FastListIter(space, w_seqiter):
-    return w_seqiter.getlength(space)
+# XXX __length_hint__()
+##def len__FastListIter(space, w_seqiter):
+##    return w_seqiter.getlength(space)
 
 
 def iter__ReverseSeqIter(space, w_seqiter):
@@ -135,19 +138,20 @@
         raise OperationError(space.w_StopIteration, space.w_None) 
     return w_item
 
-def len__ReverseSeqIter(space, w_seqiter):
-    if w_seqiter.w_seq is None:
-        return space.wrap(0)
-    index = w_seqiter.index+1
-    w_length = space.len(w_seqiter.w_seq)
-    # if length of sequence is less than index :exhaust iterator
-    if space.is_true(space.gt(space.wrap(w_seqiter.index), w_length)):
-        w_len = space.wrap(0)
-        w_seqiter.w_seq = None
-    else:
-        w_len =space.wrap(index)
-    if space.is_true(space.lt(w_len,space.wrap(0))):
-        w_len = space.wrap(0)
-    return w_len
+# XXX __length_hint__()
+##def len__ReverseSeqIter(space, w_seqiter):
+##    if w_seqiter.w_seq is None:
+##        return space.wrap(0)
+##    index = w_seqiter.index+1
+##    w_length = space.len(w_seqiter.w_seq)
+##    # if length of sequence is less than index :exhaust iterator
+##    if space.is_true(space.gt(space.wrap(w_seqiter.index), w_length)):
+##        w_len = space.wrap(0)
+##        w_seqiter.w_seq = None
+##    else:
+##        w_len =space.wrap(index)
+##    if space.is_true(space.lt(w_len,space.wrap(0))):
+##        w_len = space.wrap(0)
+##    return w_len
 
 register_all(vars())

Modified: pypy/trunk/pypy/objspace/std/rangeobject.py
==============================================================================
--- pypy/trunk/pypy/objspace/std/rangeobject.py	(original)
+++ pypy/trunk/pypy/objspace/std/rangeobject.py	Sat Oct 11 18:33:38 2008
@@ -195,15 +195,16 @@
     w_rangeiter.index += 1
     return w_item
 
-def len__RangeIter(space,  w_rangeiter):
-    if w_rangeiter.w_seq is None:
-        return wrapint(space, 0)
-    index = w_rangeiter.index
-    w_length = space.len(w_rangeiter.w_seq)
-    w_len = space.sub(w_length, wrapint(space, index))
-    if space.is_true(space.lt(w_len, wrapint(space, 0))):
-        w_len = wrapint(space, 0)
-    return w_len
+# XXX __length_hint__()
+##def len__RangeIter(space,  w_rangeiter):
+##    if w_rangeiter.w_seq is None:
+##        return wrapint(space, 0)
+##    index = w_rangeiter.index
+##    w_length = space.len(w_rangeiter.w_seq)
+##    w_len = space.sub(w_length, wrapint(space, index))
+##    if space.is_true(space.lt(w_len, wrapint(space, 0))):
+##        w_len = wrapint(space, 0)
+##    return w_len
 
 registerimplementation(W_RangeListObject)
 registerimplementation(W_RangeIterObject)

Modified: pypy/trunk/pypy/objspace/std/ropeobject.py
==============================================================================
--- pypy/trunk/pypy/objspace/std/ropeobject.py	(original)
+++ pypy/trunk/pypy/objspace/std/ropeobject.py	Sat Oct 11 18:33:38 2008
@@ -867,15 +867,16 @@
     w_ropeiter.index += 1 
     return w_item
 
-def len__RopeIter(space,  w_ropeiter):
-    if w_ropeiter.node is None:
-        return wrapint(space, 0)
-    index = w_ropeiter.index
-    length = w_ropeiter.node.length()
-    result = length - index
-    if result < 0:
-        return wrapint(space, 0)
-    return wrapint(space, result)
+# XXX __length_hint__()
+##def len__RopeIter(space,  w_ropeiter):
+##    if w_ropeiter.node is None:
+##        return wrapint(space, 0)
+##    index = w_ropeiter.index
+##    length = w_ropeiter.node.length()
+##    result = length - index
+##    if result < 0:
+##        return wrapint(space, 0)
+##    return wrapint(space, result)
 
 # register all methods
 from pypy.objspace.std import stringtype

Modified: pypy/trunk/pypy/objspace/std/ropeunicodeobject.py
==============================================================================
--- pypy/trunk/pypy/objspace/std/ropeunicodeobject.py	(original)
+++ pypy/trunk/pypy/objspace/std/ropeunicodeobject.py	Sat Oct 11 18:33:38 2008
@@ -949,15 +949,16 @@
     w_ropeiter.index += 1 
     return w_item
 
-def len__RopeUnicodeIter(space,  w_ropeiter):
-    if w_ropeiter.node is None:
-        return space.wrap(0)
-    index = w_ropeiter.index
-    length = w_ropeiter.node.length()
-    result = length - index
-    if result < 0:
-        return space.wrap(0)
-    return space.wrap(result)
+# XXX __length_hint__()
+##def len__RopeUnicodeIter(space,  w_ropeiter):
+##    if w_ropeiter.node is None:
+##        return space.wrap(0)
+##    index = w_ropeiter.index
+##    length = w_ropeiter.node.length()
+##    result = length - index
+##    if result < 0:
+##        return space.wrap(0)
+##    return space.wrap(result)
 
 import unicodetype
 register_all(vars(), unicodetype)

Modified: pypy/trunk/pypy/objspace/std/setobject.py
==============================================================================
--- pypy/trunk/pypy/objspace/std/setobject.py	(original)
+++ pypy/trunk/pypy/objspace/std/setobject.py	Sat Oct 11 18:33:38 2008
@@ -86,11 +86,12 @@
         w_setiter.content = None
     raise OperationError(space.w_StopIteration, space.w_None)
 
-def len__SetIterObject(space, w_setiter):
-    content = w_setiter.content
-    if content is None or w_setiter.len == -1:
-        return space.wrap(0)
-    return space.wrap(w_setiter.len - w_setiter.pos)
+# XXX __length_hint__()
+##def len__SetIterObject(space, w_setiter):
+##    content = w_setiter.content
+##    if content is None or w_setiter.len == -1:
+##        return space.wrap(0)
+##    return space.wrap(w_setiter.len - w_setiter.pos)
 
 # some helper functions
 

Modified: pypy/trunk/pypy/objspace/std/test/test_dictobject.py
==============================================================================
--- pypy/trunk/pypy/objspace/std/test/test_dictobject.py	(original)
+++ pypy/trunk/pypy/objspace/std/test/test_dictobject.py	Sat Oct 11 18:33:38 2008
@@ -450,6 +450,14 @@
             else:
                 assert False, 'Expected KeyError'
 
+    def test_no_len_on_dict_iter(self):
+        iterable = {1: 2, 3: 4}
+        raises(TypeError, len, iter(iterable))
+        iterable = {"1": 2, "3": 4}
+        raises(TypeError, len, iter(iterable))
+        iterable = {}
+        raises(TypeError, len, iter(iterable))
+
 
 # the minimal 'space' needed to use a W_DictObject
 class FakeSpace:

Modified: pypy/trunk/pypy/objspace/std/test/test_iterobject.py
==============================================================================
--- pypy/trunk/pypy/objspace/std/test/test_iterobject.py	(original)
+++ pypy/trunk/pypy/objspace/std/test/test_iterobject.py	Sat Oct 11 18:33:38 2008
@@ -59,117 +59,42 @@
                           C())
 
 class AppTest_IterObject(object):
-    def setup_method(self,method):
+    def test_no_len_on_list_iter(self):
+        iterable = [1,2,3,4]
+        raises(TypeError, len, iter(iterable))
+
+    def test_no_len_on_tuple_iter(self):
+        iterable = (1,2,3,4)
+        raises(TypeError, len, iter(iterable))
         
-        self.iterable = ''
-    
-    def test_len(self):#,iterable):
-        self.iterable = (1,2,3,4)
-        it = iter(self.iterable)
-        for i in reversed(range(len(it))):
-            assert len(it) == i+1
-            x = it.next()
-        raises(StopIteration, it.next)
-        assert len(it) == 0
-    
-    
-class AppTest_lenTuple(AppTest_IterObject):
-    
-    def setup_method(self,method):
-        self.iterable = (1,2,3,4)
-        
-    def test_iter_len_deque(self):
+    def test_no_len_on_deque_iter(self):
         from collections import deque
+        iterable = deque([1,2,3,4])
+        raises(TypeError, len, iter(iterable))
 
-        iterable = deque((1,2,3,4))
-        it = iter(iterable)
-        for i in reversed(range(len(it))):
-            assert len(it) == i+1
-            x = it.next()
-            
-        raises(StopIteration, it.next)
-        assert len(it) == 0
-
-    def test_iter_len_reversed(self):
-        iterable = reversed((1,2,3,4))
-        it = iter(iterable)
-        for i in reversed(range(len(it))):
-            assert len(it) == i+1
-            x = it.next()
-        raises(StopIteration, it.next)
-        assert len(it) == 0
+    def test_no_len_on_reversed(self):
+        it = reversed("foobar")
+        raises(TypeError, len, it)
 
-    def test_len_reversed_seqiter(self):
+    def test_no_len_on_reversed_seqiter(self):
+        # this one fails on CPython.  See http://bugs.python.org/issue3689
         it = reversed([5,6,7])
-        assert iter(it) is it
-        assert len(it) == 3
-        assert it.next() == 7
-        assert len(it) == 2
-        assert it.next() == 6
-        assert len(it) == 1
-        assert it.next() == 5
-        assert len(it) == 0
-        raises(StopIteration, it.next)
-        assert len(it) == 0
-
-    def test_mutation_list(self):
-        n = 5
-        d = range(n)
-        it = iter(d)
-        it.next()
-        it.next()
-        assert len(it) == n-2
-        d.append(n)
-        assert len(it) == n-1  # grow with append
-        d[1:] = []
-        assert len(it) == 0
-        assert list(it) == []
-        d.extend(xrange(20))
-        assert len(it) == 0
-
-    def test_mutation_list_reversed(self):
-        n = 5
-        d = range(n)
-        it = reversed(d)
-        it.next()
-        it.next()
-        assert len(it) == n-2
-        d.append(n)
-        assert len(it) == n-2  # Ignore append
-        d[1:] = []
-        assert len(it) == 0
-        assert list(it) == []
-        d.extend(xrange(20))
-        assert len(it) == 0
+        raises(TypeError, len, it)
 
-    def test_mutation_seqiter(self):
+    def test_no_len_on_UserList_iter(self):
         from UserList import UserList
-        n = 5
-        d = UserList(range(n))
-        it = iter(d)
-        it.next()
-        it.next()
-        assert len(it) == n-2
-        d.append(n)
-        assert len(it) == n-1  # grow with append
-        d[1:] = []
-        assert len(it) == 0
-        assert list(it) == []
-        d.extend(xrange(20))
-        assert len(it) == 0
+        iterable = UserList([1,2,3,4])
+        raises(TypeError, len, iter(iterable))
 
-    def test_mutation_seqiter_reversed(self):
+    def test_no_len_on_UserList_reversed(self):
         from UserList import UserList
-        n = 5
-        d = UserList(range(n))
-        it = reversed(d)
-        it.next()
-        it.next()
-        assert len(it) == n-2
-        d.append(n)
-        assert len(it) == n-2  # ignore append
-        d[1:] = []
-        assert len(it) == 0
-        assert list(it) == []
-        d.extend(xrange(20))
-        assert len(it) == 0
+        iterable = UserList([1,2,3,4])
+        raises(TypeError, len, reversed(iterable))
+
+    def test_no_len_on_set_iter(self):
+        iterable = set([1,2,3,4])
+        raises(TypeError, len, iter(iterable))
+
+    def test_no_len_on_xrange(self):
+        iterable = xrange(10)
+        raises(TypeError, len, iter(iterable))

Modified: pypy/trunk/pypy/objspace/std/test/test_rangeobject.py
==============================================================================
--- pypy/trunk/pypy/objspace/std/test/test_rangeobject.py	(original)
+++ pypy/trunk/pypy/objspace/std/test/test_rangeobject.py	Sat Oct 11 18:33:38 2008
@@ -120,3 +120,7 @@
         it3 = seqiter_new(*args)
         assert it3.next() == 4
         assert it3.next() == 5
+
+    def test_no_len_on_range_iter(self):
+        iterable = range(10)
+        raises(TypeError, len, iter(iterable))

Modified: pypy/trunk/pypy/objspace/std/test/test_stringobject.py
==============================================================================
--- pypy/trunk/pypy/objspace/std/test/test_stringobject.py	(original)
+++ pypy/trunk/pypy/objspace/std/test/test_stringobject.py	Sat Oct 11 18:33:38 2008
@@ -721,6 +721,10 @@
         s = "a" * (2**16)
         raises(OverflowError, s.replace, "", s)
 
+    def test_no_len_on_str_iter(self):
+        iterable = "hello"
+        raises(TypeError, len, iter(iterable))
+
 class AppTestPrebuilt(AppTestStringObject):
     def setup_class(cls):
         cls.space = gettestobjspace(**{"objspace.std.withprebuiltchar": True})

Modified: pypy/trunk/pypy/objspace/std/test/test_unicodeobject.py
==============================================================================
--- pypy/trunk/pypy/objspace/std/test/test_unicodeobject.py	(original)
+++ pypy/trunk/pypy/objspace/std/test/test_unicodeobject.py	Sat Oct 11 18:33:38 2008
@@ -641,3 +641,6 @@
 
         assert unicode(Y()).__class__ is X
     
+    def test_no_len_on_str_iter(self):
+        iterable = u"hello"
+        raises(TypeError, len, iter(iterable))




More information about the Pypy-commit mailing list