[Python-Dev] [1.6]: UserList, Dict: Do we need a UserString class?

Peter Funk pf@artcom-gmbh.de
Wed, 29 Mar 2000 01:53:50 +0200 (MEST)


Hi!

> [Peter Funk]
> > > > > Do we need a UserString class?
[...]
Guido van Rossum:
> So why don't you give the UserString.py a try and leave Andy's wish alone?

Okay.  Here we go.  Could someone please have a close eye on this?
I've haccked it up in hurry.
---- 8< ---- 8< ---- cut here ---- 8< ---- schnipp ---- 8< ---- schnapp ----
#!/usr/bin/env python
"""A user-defined wrapper around string objects

Note: string objects have grown methods in Python 1.6 
This module requires Python 1.6 or later.
"""
import sys

# XXX Totally untested and hacked up until 2:00 am with too less sleep ;-)

class UserString:
    def __init__(self, string=""):
        self.data = string
    def __repr__(self): return repr(self.data)
    def __cmp__(self, string):
        if isinstance(string, UserString):
            return cmp(self.data, string.data)
        else:
            return cmp(self.data, string)
    def __len__(self): return len(self.data)
    # methods defined in alphabetical order
    def capitalize(self): return self.__class__(self.data.capitalize())
    def center(self, width): return self.__class__(self.data.center(width))
    def count(self, sub, start=0, end=sys.maxint):
        return self.data.count(sub, start, end)
    def encode(self, encoding=None, errors=None): # XXX improve this?
        if encoding:
	    if errors:
		return self.__class__(self.data.encode(encoding, errors))
	    else:
		return self.__class__(self.data.encode(encoding))
	else: 
	    return self.__class__(self.data.encode())
    def endswith(self):
        raise NotImplementedError
    def	find(self, sub, start=0, end=sys.maxint): 
        return self.data.find(sub, start, end)
    def index(self): 
        return self.data.index(sub, start, end)
    def isdecimal(self): return self.data.isdecimal()
    def isdigit(self): return self.data.isdigit()
    def islower(self): return self.data.islower()
    def isnumeric(self): return self.data.isnumeric()
    def isspace(self): return self.data.isspace()
    def istitle(self): return self.data.istitle()
    def isupper(self): return self.data.isupper()
    def join(self, seq): return self.data.join(seq)
    def ljust(self, width): return self.__class__(self.data.ljust(width))
    def lower(self): return self.__class__(self.data.lower())
    def lstrip(self): return self.__class__(self.data.lstrip())
    def replace(self, old, new, maxsplit=-1): 
	return self.__class__(self.data.replace(old, new, maxsplit))
    def rfind(self, sub, start=0, end=sys.maxint): 
        return self.data.rfind(sub, start, end)
    def rindex(self, sub, start=0, end=sys.maxint): 
        return self.data.rindex(sub, start, end)
    def rjust(self, width): return self.__class__(self.data.rjust(width))
    def rstrip(self): return self.__class__(self.data.rstrip())
    def split(self, sep=None, maxsplit=-1): 
        return self.data.split(sep, maxsplit)
    def splitlines(self, maxsplit=-1): return self.data.splitlines(maxsplit)
    def startswith(self, prefix, start=0, end=sys.maxint): 
        return self.data.startswith(prefix, start, end)
    def strip(self): return self.__class__(self.data.strip())
    def swapcase(self): return self.__class__(self.data.swapcase())
    def title(self): return self.__class__(self.data.title())
    def translate(self, table, deletechars=""): 
        return self.__class__(self.data.translate(table, deletechars))
    def upper(self): return self.__class__(self.data.upper())

    def __add__(self, other):
        if isinstance(other, UserString):
            return self.__class__(self.data + other.data)
        elif isinstance(other, type(self.data)):
            return self.__class__(self.data + other)
        else:
            return self.__class__(self.data + str(other))
    def __radd__(self, other):
        if isinstance(other, type(self.data)):
            return self.__class__(other + self.data)
        else:
            return self.__class__(str(other) + self.data)
    def __mul__(self, n):
        return self.__class__(self.data*n)
    __rmul__ = __mul__

def _test():
    s = UserString("abc")
    u = UserString(u"efg")
    # XXX add some real tests here?
    return [0]

if __name__ == "__main__":
    import sys
    sys.exit(_test()[0])