From 882a416900ab24d78f398809d1b1a4a119db91e6 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Thu, 7 Feb 2008 03:25:46 +0000 Subject: [PATCH] Merge r60628, r60631, and r60633. Register UserList and UserString will the appropriate ABCs. --- Lib/UserList.py | 6 +++++- Lib/UserString.py | 11 +++++++++-- Lib/test/test_iterlen.py | 42 ---------------------------------------- 3 files changed, 14 insertions(+), 45 deletions(-) diff --git a/Lib/UserList.py b/Lib/UserList.py index 072f6a7327b..17f45c8c666 100644 --- a/Lib/UserList.py +++ b/Lib/UserList.py @@ -1,6 +1,8 @@ """A more or less complete user-defined wrapper around list objects.""" -class UserList: +import collections + +class UserList(collections.MutableSequence): def __init__(self, initlist=None): self.data = [] if initlist is not None: @@ -83,3 +85,5 @@ class UserList: self.data.extend(other.data) else: self.data.extend(other) + +collections.MutableSequence.register(UserList) diff --git a/Lib/UserString.py b/Lib/UserString.py index 9c58a34991d..71984a71cd4 100755 --- a/Lib/UserString.py +++ b/Lib/UserString.py @@ -6,10 +6,11 @@ Note: string objects have grown methods in Python 1.6 This module requires Python 1.6 or later. """ import sys +import collections __all__ = ["UserString","MutableString"] -class UserString: +class UserString(collections.Sequence): def __init__(self, seq): if isinstance(seq, basestring): self.data = seq @@ -129,7 +130,9 @@ class UserString: def upper(self): return self.__class__(self.data.upper()) 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 Python strings are immutable objects. This has the advantage, that @@ -208,6 +211,10 @@ class MutableString(UserString): def __imul__(self, n): self.data *= n return self + def insert(self, index, value): + self[index:index] = value + +collections.MutableSequence.register(MutableString) if __name__ == "__main__": # execute the regression test to stdout, if called as a script: diff --git a/Lib/test/test_iterlen.py b/Lib/test/test_iterlen.py index af4467e1374..2a32512e8f9 100644 --- a/Lib/test/test_iterlen.py +++ b/Lib/test/test_iterlen.py @@ -45,7 +45,6 @@ import unittest from test import test_support from itertools import repeat from collections import deque -from UserList import UserList from __builtin__ import len as _len n = 10 @@ -196,45 +195,6 @@ class TestListReversed(TestInvariantWithoutMutations): d.extend(xrange(20)) 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(): unittests = [ TestRepeat, @@ -249,8 +209,6 @@ def test_main(): TestSet, TestList, TestListReversed, - TestSeqIter, - TestSeqIterReversed, ] test_support.run_unittest(*unittests)