[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