Tidied up the implementations of reversed (including the custom ones

for xrange and list objects).

* list.__reversed__ now checks the length of the sequence object before
  calling PyList_GET_ITEM() because the mutable could have changed length.

* all three implementations are now tranparent with respect to length and
  maintain the invariant len(it) == len(list(it)) even when the underlying
  sequence mutates.

* __builtin__.reversed() now frees the underlying sequence as soon
  as the iterator is exhausted.

* the code paths were rearranged so that the most common paths
  do not require a jump.
This commit is contained in:
Raymond Hettinger 2004-03-10 10:10:42 +00:00
parent d2c36261a2
commit ef9bf4031a
4 changed files with 59 additions and 29 deletions

View file

@ -143,8 +143,8 @@ class TestReversed(unittest.TestCase):
def test_len(self):
# This is an implementation detail, not an interface requirement
s = 'hello'
self.assertEqual(len(reversed(s)), len(s))
for s in ('hello', tuple('hello'), list('hello'), xrange(5)):
self.assertEqual(len(reversed(s)), len(s))
def test_main(verbose=None):
testclasses = (EnumerateTestCase, SubclassTestCase, TestEmpty, TestBig,