Merge r60628, r60631, and r60633. Register UserList and UserString will the appropriate ABCs.

This commit is contained in:
Raymond Hettinger 2008-02-07 03:25:46 +00:00
parent 017b6a3ad2
commit 882a416900
3 changed files with 14 additions and 45 deletions

View File

@ -1,6 +1,8 @@
"""A more or less complete user-defined wrapper around list objects.""" """A more or less complete user-defined wrapper around list objects."""
class UserList: import collections
class UserList(collections.MutableSequence):
def __init__(self, initlist=None): def __init__(self, initlist=None):
self.data = [] self.data = []
if initlist is not None: if initlist is not None:
@ -83,3 +85,5 @@ class UserList:
self.data.extend(other.data) self.data.extend(other.data)
else: else:
self.data.extend(other) self.data.extend(other)
collections.MutableSequence.register(UserList)

View File

@ -6,10 +6,11 @@ Note: string objects have grown methods in Python 1.6
This module requires Python 1.6 or later. This module requires Python 1.6 or later.
""" """
import sys import sys
import collections
__all__ = ["UserString","MutableString"] __all__ = ["UserString","MutableString"]
class UserString: class UserString(collections.Sequence):
def __init__(self, seq): def __init__(self, seq):
if isinstance(seq, basestring): if isinstance(seq, basestring):
self.data = seq self.data = seq
@ -129,7 +130,9 @@ class UserString:
def upper(self): return self.__class__(self.data.upper()) def upper(self): return self.__class__(self.data.upper())
def zfill(self, width): return self.__class__(self.data.zfill(width)) def zfill(self, width): return self.__class__(self.data.zfill(width))
class MutableString(UserString): collections.Sequence.register(UserString)
class MutableString(UserString, collections.MutableSequence):
"""mutable string objects """mutable string objects
Python strings are immutable objects. This has the advantage, that Python strings are immutable objects. This has the advantage, that
@ -208,6 +211,10 @@ class MutableString(UserString):
def __imul__(self, n): def __imul__(self, n):
self.data *= n self.data *= n
return self return self
def insert(self, index, value):
self[index:index] = value
collections.MutableSequence.register(MutableString)
if __name__ == "__main__": if __name__ == "__main__":
# execute the regression test to stdout, if called as a script: # execute the regression test to stdout, if called as a script:

View File

@ -45,7 +45,6 @@ import unittest
from test import test_support from test import test_support
from itertools import repeat from itertools import repeat
from collections import deque from collections import deque
from UserList import UserList
from __builtin__ import len as _len from __builtin__ import len as _len
n = 10 n = 10
@ -196,45 +195,6 @@ class TestListReversed(TestInvariantWithoutMutations):
d.extend(xrange(20)) d.extend(xrange(20))
self.assertEqual(len(it), 0) self.assertEqual(len(it), 0)
class TestSeqIter(TestInvariantWithoutMutations):
def setUp(self):
self.it = iter(UserList(range(n)))
def test_mutation(self):
d = UserList(range(n))
it = iter(d)
it.next()
it.next()
self.assertEqual(len(it), n-2)
d.append(n)
self.assertEqual(len(it), n-1) # grow with append
d[1:] = []
self.assertEqual(len(it), 0)
self.assertEqual(list(it), [])
d.extend(xrange(20))
self.assertEqual(len(it), 0)
class TestSeqIterReversed(TestInvariantWithoutMutations):
def setUp(self):
self.it = reversed(UserList(range(n)))
def test_mutation(self):
d = UserList(range(n))
it = reversed(d)
it.next()
it.next()
self.assertEqual(len(it), n-2)
d.append(n)
self.assertEqual(len(it), n-2) # ignore append
d[1:] = []
self.assertEqual(len(it), 0)
self.assertEqual(list(it), []) # confirm invariant
d.extend(xrange(20))
self.assertEqual(len(it), 0)
def test_main(): def test_main():
unittests = [ unittests = [
TestRepeat, TestRepeat,
@ -249,8 +209,6 @@ def test_main():
TestSet, TestSet,
TestList, TestList,
TestListReversed, TestListReversed,
TestSeqIter,
TestSeqIterReversed,
] ]
test_support.run_unittest(*unittests) test_support.run_unittest(*unittests)