[py-svn] r15899 - in py/dist/py: . builtin builtin/testing

arigo at codespeak.net arigo at codespeak.net
Wed Aug 10 11:02:33 CEST 2005


Author: arigo
Date: Wed Aug 10 11:02:28 2005
New Revision: 15899

Added:
   py/dist/py/builtin/reversed.py   (contents, props changed)
   py/dist/py/builtin/testing/test_reversed.py   (contents, props changed)
Modified:
   py/dist/py/__init__.py
Log:
Added py.builtin.reversed(), copied from PyPy and tested on top of Python 2.2
as well.  This is useful for pypy/lib/test2/test_deque_extra.py.


Modified: py/dist/py/__init__.py
==============================================================================
--- py/dist/py/__init__.py	(original)
+++ py/dist/py/__init__.py	Wed Aug 10 11:02:28 2005
@@ -84,6 +84,7 @@
 
     # backports and additions of builtins
     'builtin.enumerate'      : ('./builtin/enumerate.py', 'enumerate'),
+    'builtin.reversed'       : ('./builtin/reversed.py',  'reversed'),
 
     # gateways into remote contexts
     'execnet.SocketGateway'  : ('./execnet/register.py', 'SocketGateway'),

Added: py/dist/py/builtin/reversed.py
==============================================================================
--- (empty file)
+++ py/dist/py/builtin/reversed.py	Wed Aug 10 11:02:28 2005
@@ -0,0 +1,37 @@
+from __future__ import generators
+try:
+    reversed = reversed
+except NameError:
+
+    def reversed(sequence):
+        """reversed(sequence) -> reverse iterator over values of the sequence
+
+        Return a reverse iterator
+        """
+        if hasattr(sequence, '__reversed__'):
+            return sequence.__reversed__()
+        if not hasattr(sequence, '__getitem__'):
+            raise TypeError("argument to reversed() must be a sequence")
+        return reversed_iterator(sequence)
+
+
+    class reversed_iterator(object):
+
+        def __init__(self, seq):
+            self.seq = seq
+            self.remaining = len(seq)
+
+        def __iter__(self):
+            return self
+
+        def next(self):
+            i = self.remaining
+            if i > 0:
+                i -= 1
+                item = self.seq[i]
+                self.remaining = i
+                return item
+            raise StopIteration
+
+        def __len__(self):
+            return self.remaining

Added: py/dist/py/builtin/testing/test_reversed.py
==============================================================================
--- (empty file)
+++ py/dist/py/builtin/testing/test_reversed.py	Wed Aug 10 11:02:28 2005
@@ -0,0 +1,18 @@
+from py.builtin import reversed
+from py.test import raises
+
+def test_reversed():
+    r = reversed("hello")
+    assert iter(r) is r
+    assert len(r) == 5
+    assert r.next() == "o"
+    assert r.next() == "l"
+    assert r.next() == "l"
+    assert r.next() == "e"
+    assert len(r) == 1
+    assert r.next() == "h"
+    assert len(r) == 0
+    raises(StopIteration, r.next)
+    assert len(r) == 0
+    assert list(reversed(list(reversed("hello")))) == ['h','e','l','l','o']
+    raises(TypeError, reversed, reversed("hello"))



More information about the pytest-commit mailing list