[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