[pypy-commit] pypy py3.5: Implement deque.index and fix spacing

reubano pypy.commits at gmail.com
Sun Oct 9 10:53:28 EDT 2016


Author: Reuben Cummings <reubano at gmail.com>
Branch: py3.5
Changeset: r87666:f5ff941a8b4b
Date: 2016-10-09 16:48 +0200
http://bitbucket.org/pypy/pypy/changeset/f5ff941a8b4b/

Log:	Implement deque.index and fix spacing

diff --git a/pypy/module/_collections/interp_deque.py b/pypy/module/_collections/interp_deque.py
--- a/pypy/module/_collections/interp_deque.py
+++ b/pypy/module/_collections/interp_deque.py
@@ -194,7 +194,6 @@
 
         return space.wrap(copied)
 
-
     def imul(self, w_int):
         space = self.space
         copied = self.copy()
@@ -205,7 +204,6 @@
 
         return space.wrap(self)
 
-
     def copy(self):
         """ A shallow copy """
         space = self.space
@@ -343,6 +341,45 @@
     def iter(self):
         return W_DequeIter(self)
 
+    def index(self, w_x, w_start=None, w_stop=None):
+        space = self.space
+        w_iter = space.iter(self)
+        _len = self.len
+        start = 0
+        stop = _len
+
+        if w_start is not None:
+            start = space.int_w(w_start)
+
+            if start < 0:
+                start += _len
+
+            if start < 0:
+                start = 0
+            elif start > _len:
+                start = _len
+
+        if w_stop is not None:
+            stop = space.int_w(w_stop)
+
+            if stop < 0:
+                stop += _len
+
+            if 0 <= stop > _len:
+                stop = _len
+
+        for i in range(0, stop):
+            value = space.next(w_iter)
+
+            if i < start:
+                continue
+
+            if space.eq_w(value, w_x):
+                return space.wrap(i)
+
+        x = space.repr(w_x)
+        raise oefmt(self.space.w_ValueError, "%s is not in deque" % x)
+
     def reviter(self):
         "Return a reverse iterator over the deque."
         return W_DequeRevIter(self)
@@ -508,6 +545,7 @@
     count      = interp2app(W_Deque.count),
     extend     = interp2app(W_Deque.extend),
     extendleft = interp2app(W_Deque.extendleft),
+    index      = interp2app(W_Deque.index),
     pop        = interp2app(W_Deque.pop),
     popleft    = interp2app(W_Deque.popleft),
     remove     = interp2app(W_Deque.remove),
diff --git a/pypy/module/_collections/test/test_deque.py b/pypy/module/_collections/test/test_deque.py
--- a/pypy/module/_collections/test/test_deque.py
+++ b/pypy/module/_collections/test/test_deque.py
@@ -290,6 +290,21 @@
         mut[0] = 11
         assert d == e
 
+    def test_index(self):
+        from _collections import deque
+        d = deque([1,2,'a',1,2])
+        assert d.index(1) is 0
+        assert d.index('a') is 2
+        assert d.index(1,2) is 3
+        assert d.index('a',-3) is 2
+        assert d.index('a',-3,-1) is 2
+        assert d.index('a',-9) is 2
+        raises(ValueError, d.index, 2, 2, -1)
+        raises(ValueError, d.index, 1, 1, 3)
+        raises(ValueError, d.index, 'a', -3, -3)
+        raises(ValueError, d.index, 'a', 1, -3)
+        raises(ValueError, d.index, 'a', -3, -9)
+
     def test_reversed(self):
         from _collections import deque
         for s in ('abcd', range(200)):


More information about the pypy-commit mailing list