[pypy-svn] r56461 - in pypy/dist/pypy/module/itertools: . test
adurdin at codespeak.net
adurdin at codespeak.net
Fri Jul 11 18:27:36 CEST 2008
Author: adurdin
Date: Fri Jul 11 18:27:35 2008
New Revision: 56461
Modified:
pypy/dist/pypy/module/itertools/interp_itertools.py
pypy/dist/pypy/module/itertools/test/test_itertools.py
Log:
(adurdin)
- Removed cruft from test_itertools
- Made interp_itertools more RPythonic
Modified: pypy/dist/pypy/module/itertools/interp_itertools.py
==============================================================================
--- pypy/dist/pypy/module/itertools/interp_itertools.py (original)
+++ pypy/dist/pypy/module/itertools/interp_itertools.py Fri Jul 11 18:27:35 2008
@@ -382,30 +382,32 @@
i += 1
- self.iterators = iter(iterators_w)
+ self.iterators_w = iterators_w
+ self.current_iterator = 0
+ self.num_iterators = len(iterators_w)
self.started = False
def iter_w(self):
return self.space.wrap(self)
def next_w(self):
+ if self.current_iterator >= self.num_iterators:
+ raise OperationError(self.space.w_StopIteration, self.space.w_None)
if not self.started:
- try:
- self.w_it = self.iterators.next()
- except StopIteration:
- raise OperationError(self.space.w_StopIteration, self.space.w_None)
- else:
- self.started = True
+ self.current_iterator = 0
+ self.w_it = self.iterators_w[self.current_iterator]
+ self.started = True
while True:
try:
w_obj = self.space.next(self.w_it)
except OperationError, e:
if e.match(self.space, self.space.w_StopIteration):
- try:
- self.w_it = self.iterators.next()
- except StopIteration:
+ self.current_iterator += 1
+ if self.current_iterator >= self.num_iterators:
raise OperationError(self.space.w_StopIteration, self.space.w_None)
+ else:
+ self.w_it = self.iterators_w[self.current_iterator]
else:
raise
else:
@@ -467,17 +469,16 @@
raise OperationError(self.space.w_StopIteration, self.space.w_None)
try:
- w_objects = [self.space.next(w_it) for w_it in self.iterators_w]
+ w_objects = self.space.newtuple([self.space.next(w_it) for w_it in self.iterators_w])
except OperationError, e:
if e.match(self.space, self.space.w_StopIteration):
self.iterators_w = None
raise
if self.identity_fun:
- return self.space.newtuple(w_objects)
+ return w_objects
else:
- # XXX cannot use '*w_objects'; see space.call()
- return self.space.call_function(self.w_fun, *w_objects)
+ return self.space.call(self.w_fun, w_objects)
def W_IMap___new__(space, w_subtype, w_fun, args_w):
@@ -545,7 +546,7 @@
self.space = space
self.saved_w = []
self.w_iterable = space.iter(w_iterable)
- self.saved_iterator = None
+ self.index = 0
self.exhausted = False
def iter_w(self):
@@ -556,10 +557,12 @@
if not self.saved_w:
raise OperationError(self.space.w_StopIteration, self.space.w_None)
try:
- w_obj = self.saved_iterator.next()
- except StopIteration:
- self.saved_iterator = iter(self.saved_w)
- w_obj = self.saved_iterator.next()
+ w_obj = self.saved_w[self.index]
+ except IndexError:
+ self.index = 1
+ w_obj = self.saved_w[0]
+ else:
+ self.index += 1
else:
try:
w_obj = self.space.next(self.w_iterable)
@@ -568,11 +571,12 @@
self.exhausted = True
if not self.saved_w:
raise
- self.saved_iterator = iter(self.saved_w)
- w_obj = self.saved_iterator.next()
+ self.index = 1
+ w_obj = self.saved_w[0]
else:
raise
else:
+ self.index += 1
self.saved_w.append(w_obj)
return w_obj
Modified: pypy/dist/pypy/module/itertools/test/test_itertools.py
==============================================================================
--- pypy/dist/pypy/module/itertools/test/test_itertools.py (original)
+++ pypy/dist/pypy/module/itertools/test/test_itertools.py Fri Jul 11 18:27:35 2008
@@ -461,22 +461,23 @@
def test_subclassing(self):
import itertools
- # Although implemented as classes, the itertools functions should not be subclassable
+ # Although (mostly) implemented as classes, the itertools functions should not be subclassable
iterables = [
- (itertools.chain, ()),
- (itertools.count, ()),
- (itertools.cycle, ()),
- (itertools.dropwhile, (bool, [])),
- (itertools.ifilter, (None, [])),
- (itertools.ifilterfalse, (None, [])),
- (itertools.imap, (None,)),
- (itertools.islice, ([], 0)),
- (itertools.izip, ()),
- (itertools.repeat, (None,)),
- (itertools.starmap, (bool, [])),
- (itertools.takewhile, (bool, [])),
+ itertools.chain,
+ itertools.count,
+ itertools.cycle,
+ itertools.dropwhile,
+ itertools.ifilter,
+ itertools.ifilterfalse,
+ itertools.imap,
+ itertools.islice,
+ itertools.izip,
+ itertools.repeat,
+ itertools.starmap,
+ itertools.takewhile,
+ itertools.tee,
]
- for cls, args in iterables:
+ for cls in iterables:
try:
class A(cls):
pass
@@ -484,4 +485,4 @@
pass
else:
assert False, "Subclassing should fail."
-
+
More information about the Pypy-commit
mailing list