[pypy-commit] pypy py3k: use py3 __next__/builtins.next()

pjenvey noreply at buildbot.pypy.org
Tue Oct 16 02:40:56 CEST 2012


Author: Philip Jenvey <pjenvey at underboss.org>
Branch: py3k
Changeset: r58126:a496b3369dae
Date: 2012-10-15 17:39 -0700
http://bitbucket.org/pypy/pypy/changeset/a496b3369dae/

Log:	use py3 __next__/builtins.next()

diff --git a/lib_pypy/itertools.py b/lib_pypy/itertools.py
--- a/lib_pypy/itertools.py
+++ b/lib_pypy/itertools.py
@@ -46,22 +46,18 @@
     """
     def __init__(self, *iterables):
         self._iterables_iter = iter(map(iter, iterables))
-        # little trick for the first chain.next() call
+        # little trick for the first chain.__next__() call
         self._cur_iterable_iter = iter([])
 
     def __iter__(self):
         return self
     
-    def next(self):
+    def __next__(self):
         while True:
             try:
-                return self._cur_iterable_iter.next()
+                return next(self._cur_iterable_iter)
             except StopIteration:
-                self._cur_iterable_iter = self._iterables_iter.next()
-            except AttributeError:
-                # CPython raises a TypeError when next() is not defined
-                raise TypeError('%s has no next() method' % \
-                                (self._cur_iterable_iter))
+                self._cur_iterable_iter = next(self._iterables_iter)
 
 
 class compress(object):
@@ -72,10 +68,10 @@
     def __iter__(self):
         return self
 
-    def next(self):
+    def __next__(self):
         while True:
-            next_item = self.data.next()
-            next_selector = self.selectors.next()
+            next_item = next(self.data)
+            next_selector = next(self.selectors)
             if bool(next_selector):
                 return next_item
 
@@ -104,7 +100,7 @@
     def __iter__(self):
         return self
 
-    def next(self):
+    def __next__(self):
         self.times += 1
         return self.times
 
@@ -137,20 +133,16 @@
     def __iter__(self):
         return self
 
-    def next(self):
+    def __next__(self):
         # XXX Could probably be improved
         try:
-            next_elt = self._cur_iter.next()
+            next_elt = next(self._cur_iter)
             if self._must_save:
                 self._saved.append(next_elt)
         except StopIteration:
             self._cur_iter = iter(self._saved)
-            next_elt = self._cur_iter.next()
+            next_elt = next(self._cur_iter)
             self._must_save = False
-        except AttributeError:
-            # CPython raises a TypeError when next() is not defined
-            raise TypeError('%s has no next() method' % \
-                            (self._cur_iter))
         return next_elt
             
         
@@ -179,17 +171,12 @@
     def __iter__(self):
         return self
 
-    def next(self):
-        try:
-            value = self._iter.next()
-        except AttributeError:
-            # CPython raises a TypeError when next() is not defined
-            raise TypeError('%s has no next() method' % \
-                            (self._iter))
+    def __next__(self):
+        value = next(self._iter)
         if self._dropped:
             return value
         while self._predicate(value):
-            value = self._iter.next()
+            value = next(self._iter)
         self._dropped = True
         return value
 
@@ -222,14 +209,9 @@
     def __iter__(self):
         return self
 
-    def next(self):
+    def __next__(self):
         while self.currkey == self.tgtkey:
-            try:
-                self.currvalue = self.it.next() # Exit on StopIteration
-            except AttributeError:
-                # CPython raises a TypeError when next() is not defined
-                raise TypeError('%s has no next() method' % \
-                                (self.it))            
+            self.currvalue = next(self.it) # Exit on StopIteration
             self.currkey = self.keyfunc(self.currvalue)
         self.tgtkey = self.currkey
         return (self.currkey, self._grouper(self.tgtkey))
@@ -237,7 +219,7 @@
     def _grouper(self, tgtkey):
         while self.currkey == tgtkey:
             yield self.currvalue
-            self.currvalue = self.it.next() # Exit on StopIteration
+            self.currvalue = next(self.it) # Exit on StopIteration
             self.currkey = self.keyfunc(self.currvalue)
 
 
@@ -269,17 +251,12 @@
             if predicate(x):
                 yield x
     """
-    def next(self):
-        try:
-            next_elt = self._iter.next()
-        except AttributeError:
-            # CPython raises a TypeError when next() is not defined
-            raise TypeError('%s has no next() method' % \
-                            (self._iter))
+    def __next__(self):
+        next_elt = next(self._iter)
         while True:
             if self._predicate(next_elt):
                 return next_elt
-            next_elt = self._iter.next()
+            next_elt = next(self._iter)
 
 class ifilterfalse(_ifilter_base):
     """Make an iterator that filters elements from iterable returning
@@ -295,17 +272,12 @@
             if not predicate(x):
                 yield x
     """
-    def next(self):
-        try:
-            next_elt = self._iter.next()
-        except AttributeError:
-            # CPython raises a TypeError when next() is not defined
-            raise TypeError('%s has no next() method' % \
-                            (self._iter))
+    def __next__(self):
+        next_elt = next(self._iter)
         while True:
             if not self._predicate(next_elt):
                 return next_elt
-            next_elt = self._iter.next()
+            next_elt = next(self._iter)
              
 
 
@@ -325,7 +297,7 @@
     def imap(function, *iterables):
         iterables = map(iter, iterables)
         while True:
-            args = [i.next() for i in iterables]
+            args = [next(i) for i in iterables]
             if function is None:
                 yield tuple(args)
             else:
@@ -339,13 +311,8 @@
     def __iter__(self):
         return self
 
-    def next(self):
-        try:
-            args = [it.next() for it in self._iters]
-        except AttributeError:
-            # CPython raises a TypeError when next() is not defined
-            raise TypeError('%s has no next() method' % \
-                            (it))
+    def __next__(self):
+        args = [next(it) for it in self._iters]
         if self._func is None:
             return tuple(args)
         else:
@@ -369,9 +336,9 @@
     def __init__(self, iterable, *args):
         s = slice(*args)
         self.start, self.stop, self.step = s.start or 0, s.stop, s.step
-        if not isinstance(self.start, (int, long)):
+        if not isinstance(self.start, int):
            raise ValueError("Start argument must be an integer")
-        if self.stop is not None and not isinstance(self.stop, (int,long)):
+        if self.stop is not None and not isinstance(self.stop, int):
            raise ValueError("Stop argument must be an integer or None")
         if self.step is None:
             self.step = 1
@@ -385,17 +352,12 @@
     def __iter__(self):
         return self
 
-    def next(self): 
-        if self.donext is None:
-            try:
-                self.donext = self.it.next
-            except AttributeError:
-                raise TypeError
+    def __next__(self):
         nextindex = self.start
         if self.stop is not None and nextindex >= self.stop:
             raise StopIteration
         while self.cnt <= nextindex:
-            nextitem = self.donext()
+            nextitem = next(self.it)
             self.cnt += 1
         self.start += self.step 
         return nextitem
@@ -411,7 +373,7 @@
     def izip(*iterables):
         iterables = map(iter, iterables)
         while iterables:
-            result = [i.next() for i in iterables]
+            result = [next(i) for i in iterables]
             yield tuple(result)
     """
     def __init__(self, *iterables):
@@ -421,14 +383,10 @@
     def __iter__(self):
         return self
 
-    def next(self):
+    def __next__(self):
         if not self._iterators:
             raise StopIteration()
-        try:
-            return tuple([i.next() for i in self._iterators])
-        except AttributeError:
-            # CPython raises a TypeError when next() is not defined
-            raise TypeError('%s has no next() method' % (i))
+        return tuple([next(i) for i in self._iterators])
 
 
 class product(object):
@@ -469,7 +427,7 @@
     def __iter__(self):
         return self
 
-    def next(self):
+    def __next__(self):
         if not self.cont:
             raise StopIteration
         l = []
@@ -508,8 +466,8 @@
     def __iter__(self):
         return self
 
-    def next(self):
-        # next() *need* to decrement self._times when consumed
+    def __next__(self):
+        # __next__() *need* to decrement self._times when consumed
         if self._times is not None:
             if self._times <= 0: 
                 raise StopIteration()
@@ -541,7 +499,7 @@
     def starmap(function, iterable):
         iterable = iter(iterable)
         while True:
-            yield function(*iterable.next())    
+            yield function(*next(iterable))
     """
     def __init__(self, function, iterable):
         self._func = function
@@ -550,13 +508,9 @@
     def __iter__(self):
         return self
 
-    def next(self):
+    def __next__(self):
         # CPython raises a TypeError when the iterator doesn't return a tuple
-        try:
-            t = self._iter.next()
-        except AttributeError:
-            # CPython raises a TypeError when next() is not defined
-            raise TypeError('%s has no next() method' % self._iter)
+        t = next(self._iter)
         if not isinstance(t, tuple):
             raise TypeError("iterator must return a tuple")
         return self._func(*t)
@@ -583,13 +537,8 @@
     def __iter__(self):
         return self
 
-    def next(self):
-        try:
-            value = self._iter.next()
-        except AttributeError:
-            # CPython raises a TypeError when next() is not defined
-            raise TypeError('%s has no next() method' % \
-                            (self._iter))
+    def __next__(self):
+        value = next(self._iter)
         if not self._predicate(value):
             raise StopIteration()
         return value
@@ -604,11 +553,7 @@
     def __getitem__(self, i):
         # iterates until 'i' if not done yet
         while i>= len(self.data):
-            try:
-                self.data.append( self._iter.next() )
-            except AttributeError:
-                # CPython raises a TypeError when next() is not defined
-                raise TypeError('%s has no next() method' % self._iter)
+            self.data.append(next(self._iter))
         return self.data[i]
 
 
@@ -626,7 +571,7 @@
             self.tee_data = TeeData(iter(iterable))
             self.pos = 0
             
-    def next(self):
+    def __next__(self):
         data = self.tee_data[self.pos]
         self.pos += 1
         return data
@@ -649,18 +594,18 @@
     of tee()
     
     Equivalent to :
-    
+
     def tee(iterable, n=2):
-        def gen(next, data={}, cnt=[0]):
-            for i in count():
-                if i == cnt[0]:
-                    item = data[i] = next()
-                    cnt[0] += 1
-                else:
-                    item = data.pop(i)
-                yield item
         it = iter(iterable)
-        return tuple([gen(it.next) for i in range(n)])
+        deques = [collections.deque() for i in range(n)]
+        def gen(mydeque):
+            while True:
+                if not mydeque:             # when the local deque is empty
+                    newval = next(it)       # fetch a new value and
+                    for d in deques:        # load it to all the deques
+                        d.append(newval)
+                yield mydeque.popleft()
+        return tuple(gen(d) for d in deques)
     """
     if isinstance(iterable, TeeObject):
         # a,b = tee(range(10)) ; c,d = tee(a) ; self.assert_(a is c)


More information about the pypy-commit mailing list