3 """A user-defined wrapper around string objects
5 Note: string objects have grown methods in Python 1.6
6 This module requires Python 1.6 or later.
8 from types
import StringType, UnicodeType
11 __all__ = [
"UserString",
"MutableString"]
15 if isinstance(seq, StringType)
or isinstance(seq, UnicodeType):
17 elif isinstance(seq, UserString):
18 self.
data = seq.data[:]
30 if isinstance(string, UserString):
31 return cmp(self.
data, string.data)
35 return char
in self.
data
40 start =
max(start, 0); end =
max(end, 0)
41 return self.__class__(self.
data[start:end])
44 if isinstance(other, UserString):
45 return self.__class__(self.
data + other.data)
46 elif isinstance(other, StringType)
or isinstance(other, UnicodeType):
47 return self.__class__(self.
data + other)
49 return self.__class__(self.
data +
str(other))
51 if isinstance(other, StringType)
or isinstance(other, UnicodeType):
52 return self.__class__(other + self.
data)
54 return self.__class__(
str(other) + self.
data)
56 if isinstance(other, UserString):
57 self.
data += other.data
58 elif isinstance(other, StringType)
or isinstance(other, UnicodeType):
64 return self.__class__(self.
data*n)
71 def capitalize(self):
return self.__class__(self.data.capitalize())
72 def center(self, width):
return self.__class__(self.data.center(width))
73 def count(self, sub, start=0, end=sys.maxint):
74 return self.data.count(sub, start, end)
75 def decode(self, encoding=None, errors=None):
78 return self.__class__(self.data.decode(encoding, errors))
80 return self.__class__(self.data.decode(encoding))
82 return self.__class__(self.data.decode())
83 def encode(self, encoding=None, errors=None):
86 return self.__class__(self.data.encode(encoding, errors))
88 return self.__class__(self.data.encode(encoding))
90 return self.__class__(self.data.encode())
91 def endswith(self, suffix, start=0, end=sys.maxint):
92 return self.data.endswith(suffix, start, end)
94 return self.__class__(self.data.expandtabs(tabsize))
95 def find(self, sub, start=0, end=sys.maxint):
96 return self.data.find(sub, start, end)
97 def index(self, sub, start=0, end=sys.maxint):
98 return self.data.index(sub, start, end)
99 def isalpha(self):
return self.data.isalpha()
108 def join(self, seq):
return self.data.join(seq)
109 def ljust(self, width):
return self.__class__(self.data.ljust(width))
110 def lower(self):
return self.__class__(self.data.lower())
111 def lstrip(self):
return self.__class__(self.data.lstrip())
113 return self.__class__(self.data.replace(old, new, maxsplit))
114 def rfind(self, sub, start=0, end=sys.maxint):
115 return self.data.rfind(sub, start, end)
116 def rindex(self, sub, start=0, end=sys.maxint):
117 return self.data.rindex(sub, start, end)
118 def rjust(self, width):
return self.__class__(self.data.rjust(width))
119 def rstrip(self):
return self.__class__(self.data.rstrip())
120 def split(self, sep=None, maxsplit=-1):
121 return self.data.split(sep, maxsplit)
122 def splitlines(self, keepends=0):
return self.data.splitlines(keepends)
124 return self.data.startswith(prefix, start, end)
125 def strip(self):
return self.__class__(self.data.strip())
126 def swapcase(self):
return self.__class__(self.data.swapcase())
127 def title(self):
return self.__class__(self.data.title())
129 return self.__class__(self.data.translate(*args))
130 def upper(self):
return self.__class__(self.data.upper())
133 """mutable string objects
135 Python strings are immutable objects. This has the advantage, that
136 strings may be used as dictionary keys. If this property isn't needed
137 and you insist on changing string values in place instead, you may cheat
138 and use MutableString.
140 But the purpose of this class is an educational one: to prevent
141 people from inventing their own mutable string class derived
142 from UserString and than forget thereby to remove (override) the
143 __hash__ method inherited from ^UserString. This would lead to
144 errors that would be very hard to track down.
146 A faster and better solution is to rewrite your program using lists."""
150 raise TypeError,
"unhashable type (it is mutable)"
152 if index < 0
or index >= len(self.
data):
raise IndexError
153 self.
data = self.
data[:index] + sub + self.
data[index+1:]
155 if index < 0
or index >= len(self.
data):
raise IndexError
158 start =
max(start, 0); end =
max(end, 0)
159 if isinstance(sub, UserString):
161 elif isinstance(sub, StringType)
or isinstance(sub, UnicodeType):
166 start =
max(start, 0); end =
max(end, 0)
171 if __name__ ==
"__main__":
174 called_in_dir, called_as = os.path.split(sys.argv[0])
175 called_in_dir = os.path.abspath(called_in_dir)
176 called_as, py = os.path.splitext(called_as)
177 sys.path.append(os.path.join(called_in_dir,
'test'))
180 test_support.verbose = 0
181 __import__(
'test_' + called_as.lower())