[pypy-svn] pypy collections-module: d.extend(d), d += e.

arigo commits-noreply at bitbucket.org
Tue Feb 15 16:02:54 CET 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: collections-module
Changeset: r41968:5b92b891b703
Date: 2011-02-15 15:21 +0100
http://bitbucket.org/pypy/pypy/changeset/5b92b891b703/

Log:	d.extend(d), d += e.

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
@@ -111,19 +111,22 @@
                 assert cmp(x,y) == cmp(list(x),list(y))
 
     def test_extend(self):
+        from _collections import deque
         d = deque('a')
-        self.assertRaises(TypeError, d.extend, 1)
         d.extend('bcd')
-        self.assertEqual(list(d), list('abcd'))
+        assert list(d) == list('abcd')
         d.extend(d)
-        self.assertEqual(list(d), list('abcdabcd'))
+        assert list(d) == list('abcdabcd')
 
     def test_iadd(self):
+        from _collections import deque
         d = deque('a')
+        original_d = d
         d += 'bcd'
-        self.assertEqual(list(d), list('abcd'))
+        assert list(d) == list('abcd')
         d += d
-        self.assertEqual(list(d), list('abcdabcd'))
+        assert list(d) == list('abcdabcd')
+        assert original_d is d
 
     def test_extendleft(self):
         d = deque('a')

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
@@ -162,8 +162,11 @@
 
     @unwrap_spec('self', W_Root)
     def extend(self, w_iterable):
-        # XXX Handle case where id(deque) == id(iterable)
+        # Handle case where id(deque) == id(iterable)
         space = self.space
+        if space.is_w(space.wrap(self), w_iterable):
+            w_iterable = space.call_function(space.w_list, w_iterable)
+        #
         w_iter = space.iter(w_iterable)
         while True:
             try:
@@ -175,8 +178,17 @@
             self.append(w_obj)
 
     @unwrap_spec('self', W_Root)
+    def iadd(self, w_iterable):
+        self.extend(w_iterable)
+        return self.space.wrap(self)
+
+    @unwrap_spec('self', W_Root)
     def extendleft(self, w_iterable):
-        # XXX Handle case where id(deque) == id(iterable)
+        # Handle case where id(deque) == id(iterable)
+        space = self.space
+        if space.is_w(space.wrap(self), w_iterable):
+            w_iterable = space.call_function(space.w_list, w_iterable)
+        #
         space = self.space
         w_iter = space.iter(w_iterable)
         while True:
@@ -336,6 +348,7 @@
     __ne__ = interp2app(W_Deque.ne),
     __gt__ = interp2app(W_Deque.gt),
     __ge__ = interp2app(W_Deque.ge),
+    __iadd__ = interp2app(W_Deque.iadd),
     maxlen = GetSetProperty(W_Deque.get_maxlen),
 )
 


More information about the Pypy-commit mailing list