python-2.5.2/win32/Lib/UserString.py
changeset 0 ae805ac0140d
equal deleted inserted replaced
-1:000000000000 0:ae805ac0140d
       
     1 #!/usr/bin/env python
       
     2 ## vim:ts=4:et:nowrap
       
     3 """A user-defined wrapper around string objects
       
     4 
       
     5 Note: string objects have grown methods in Python 1.6
       
     6 This module requires Python 1.6 or later.
       
     7 """
       
     8 import sys
       
     9 
       
    10 __all__ = ["UserString","MutableString"]
       
    11 
       
    12 class UserString:
       
    13     def __init__(self, seq):
       
    14         if isinstance(seq, basestring):
       
    15             self.data = seq
       
    16         elif isinstance(seq, UserString):
       
    17             self.data = seq.data[:]
       
    18         else:
       
    19             self.data = str(seq)
       
    20     def __str__(self): return str(self.data)
       
    21     def __repr__(self): return repr(self.data)
       
    22     def __int__(self): return int(self.data)
       
    23     def __long__(self): return long(self.data)
       
    24     def __float__(self): return float(self.data)
       
    25     def __complex__(self): return complex(self.data)
       
    26     def __hash__(self): return hash(self.data)
       
    27 
       
    28     def __cmp__(self, string):
       
    29         if isinstance(string, UserString):
       
    30             return cmp(self.data, string.data)
       
    31         else:
       
    32             return cmp(self.data, string)
       
    33     def __contains__(self, char):
       
    34         return char in self.data
       
    35 
       
    36     def __len__(self): return len(self.data)
       
    37     def __getitem__(self, index): return self.__class__(self.data[index])
       
    38     def __getslice__(self, start, end):
       
    39         start = max(start, 0); end = max(end, 0)
       
    40         return self.__class__(self.data[start:end])
       
    41 
       
    42     def __add__(self, other):
       
    43         if isinstance(other, UserString):
       
    44             return self.__class__(self.data + other.data)
       
    45         elif isinstance(other, basestring):
       
    46             return self.__class__(self.data + other)
       
    47         else:
       
    48             return self.__class__(self.data + str(other))
       
    49     def __radd__(self, other):
       
    50         if isinstance(other, basestring):
       
    51             return self.__class__(other + self.data)
       
    52         else:
       
    53             return self.__class__(str(other) + self.data)
       
    54     def __mul__(self, n):
       
    55         return self.__class__(self.data*n)
       
    56     __rmul__ = __mul__
       
    57     def __mod__(self, args):
       
    58         return self.__class__(self.data % args)
       
    59 
       
    60     # the following methods are defined in alphabetical order:
       
    61     def capitalize(self): return self.__class__(self.data.capitalize())
       
    62     def center(self, width, *args):
       
    63         return self.__class__(self.data.center(width, *args))
       
    64     def count(self, sub, start=0, end=sys.maxint):
       
    65         return self.data.count(sub, start, end)
       
    66     def decode(self, encoding=None, errors=None): # XXX improve this?
       
    67         if encoding:
       
    68             if errors:
       
    69                 return self.__class__(self.data.decode(encoding, errors))
       
    70             else:
       
    71                 return self.__class__(self.data.decode(encoding))
       
    72         else:
       
    73             return self.__class__(self.data.decode())
       
    74     def encode(self, encoding=None, errors=None): # XXX improve this?
       
    75         if encoding:
       
    76             if errors:
       
    77                 return self.__class__(self.data.encode(encoding, errors))
       
    78             else:
       
    79                 return self.__class__(self.data.encode(encoding))
       
    80         else:
       
    81             return self.__class__(self.data.encode())
       
    82     def endswith(self, suffix, start=0, end=sys.maxint):
       
    83         return self.data.endswith(suffix, start, end)
       
    84     def expandtabs(self, tabsize=8):
       
    85         return self.__class__(self.data.expandtabs(tabsize))
       
    86     def find(self, sub, start=0, end=sys.maxint):
       
    87         return self.data.find(sub, start, end)
       
    88     def index(self, sub, start=0, end=sys.maxint):
       
    89         return self.data.index(sub, start, end)
       
    90     def isalpha(self): return self.data.isalpha()
       
    91     def isalnum(self): return self.data.isalnum()
       
    92     def isdecimal(self): return self.data.isdecimal()
       
    93     def isdigit(self): return self.data.isdigit()
       
    94     def islower(self): return self.data.islower()
       
    95     def isnumeric(self): return self.data.isnumeric()
       
    96     def isspace(self): return self.data.isspace()
       
    97     def istitle(self): return self.data.istitle()
       
    98     def isupper(self): return self.data.isupper()
       
    99     def join(self, seq): return self.data.join(seq)
       
   100     def ljust(self, width, *args):
       
   101         return self.__class__(self.data.ljust(width, *args))
       
   102     def lower(self): return self.__class__(self.data.lower())
       
   103     def lstrip(self, chars=None): return self.__class__(self.data.lstrip(chars))
       
   104     def partition(self, sep):
       
   105         return self.data.partition(sep)
       
   106     def replace(self, old, new, maxsplit=-1):
       
   107         return self.__class__(self.data.replace(old, new, maxsplit))
       
   108     def rfind(self, sub, start=0, end=sys.maxint):
       
   109         return self.data.rfind(sub, start, end)
       
   110     def rindex(self, sub, start=0, end=sys.maxint):
       
   111         return self.data.rindex(sub, start, end)
       
   112     def rjust(self, width, *args):
       
   113         return self.__class__(self.data.rjust(width, *args))
       
   114     def rpartition(self, sep):
       
   115         return self.data.rpartition(sep)
       
   116     def rstrip(self, chars=None): return self.__class__(self.data.rstrip(chars))
       
   117     def split(self, sep=None, maxsplit=-1):
       
   118         return self.data.split(sep, maxsplit)
       
   119     def rsplit(self, sep=None, maxsplit=-1):
       
   120         return self.data.rsplit(sep, maxsplit)
       
   121     def splitlines(self, keepends=0): return self.data.splitlines(keepends)
       
   122     def startswith(self, prefix, start=0, end=sys.maxint):
       
   123         return self.data.startswith(prefix, start, end)
       
   124     def strip(self, chars=None): return self.__class__(self.data.strip(chars))
       
   125     def swapcase(self): return self.__class__(self.data.swapcase())
       
   126     def title(self): return self.__class__(self.data.title())
       
   127     def translate(self, *args):
       
   128         return self.__class__(self.data.translate(*args))
       
   129     def upper(self): return self.__class__(self.data.upper())
       
   130     def zfill(self, width): return self.__class__(self.data.zfill(width))
       
   131 
       
   132 class MutableString(UserString):
       
   133     """mutable string objects
       
   134 
       
   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.
       
   139 
       
   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.
       
   145 
       
   146     A faster and better solution is to rewrite your program using lists."""
       
   147     def __init__(self, string=""):
       
   148         self.data = string
       
   149     def __hash__(self):
       
   150         raise TypeError, "unhashable type (it is mutable)"
       
   151     def __setitem__(self, index, sub):
       
   152         if index < 0:
       
   153             index += len(self.data)
       
   154         if index < 0 or index >= len(self.data): raise IndexError
       
   155         self.data = self.data[:index] + sub + self.data[index+1:]
       
   156     def __delitem__(self, index):
       
   157         if index < 0:
       
   158             index += len(self.data)
       
   159         if index < 0 or index >= len(self.data): raise IndexError
       
   160         self.data = self.data[:index] + self.data[index+1:]
       
   161     def __setslice__(self, start, end, sub):
       
   162         start = max(start, 0); end = max(end, 0)
       
   163         if isinstance(sub, UserString):
       
   164             self.data = self.data[:start]+sub.data+self.data[end:]
       
   165         elif isinstance(sub, basestring):
       
   166             self.data = self.data[:start]+sub+self.data[end:]
       
   167         else:
       
   168             self.data =  self.data[:start]+str(sub)+self.data[end:]
       
   169     def __delslice__(self, start, end):
       
   170         start = max(start, 0); end = max(end, 0)
       
   171         self.data = self.data[:start] + self.data[end:]
       
   172     def immutable(self):
       
   173         return UserString(self.data)
       
   174     def __iadd__(self, other):
       
   175         if isinstance(other, UserString):
       
   176             self.data += other.data
       
   177         elif isinstance(other, basestring):
       
   178             self.data += other
       
   179         else:
       
   180             self.data += str(other)
       
   181         return self
       
   182     def __imul__(self, n):
       
   183         self.data *= n
       
   184         return self
       
   185 
       
   186 if __name__ == "__main__":
       
   187     # execute the regression test to stdout, if called as a script:
       
   188     import os
       
   189     called_in_dir, called_as = os.path.split(sys.argv[0])
       
   190     called_as, py = os.path.splitext(called_as)
       
   191     if '-q' in sys.argv:
       
   192         from test import test_support
       
   193         test_support.verbose = 0
       
   194     __import__('test.test_' + called_as.lower())