14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#!/usr/bin/env python 24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao## vim:ts=4:et:nowrap 34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""A user-defined wrapper around string objects 44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 54adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoNote: string objects have grown methods in Python 1.6 64adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoThis module requires Python 1.6 or later. 74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao""" 84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport sys 94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport collections 104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__all__ = ["UserString","MutableString"] 124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass UserString(collections.Sequence): 144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __init__(self, seq): 154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if isinstance(seq, basestring): 164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data = seq 174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif isinstance(seq, UserString): 184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data = seq.data[:] 194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data = str(seq) 214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __str__(self): return str(self.data) 224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __repr__(self): return repr(self.data) 234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __int__(self): return int(self.data) 244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __long__(self): return long(self.data) 254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __float__(self): return float(self.data) 264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __complex__(self): return complex(self.data) 274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __hash__(self): return hash(self.data) 284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __cmp__(self, string): 304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if isinstance(string, UserString): 314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return cmp(self.data, string.data) 324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return cmp(self.data, string) 344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __contains__(self, char): 354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return char in self.data 364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __len__(self): return len(self.data) 384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __getitem__(self, index): return self.__class__(self.data[index]) 394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __getslice__(self, start, end): 404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start = max(start, 0); end = max(end, 0) 414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data[start:end]) 424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __add__(self, other): 444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if isinstance(other, UserString): 454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data + other.data) 464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif isinstance(other, basestring): 474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data + other) 484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data + str(other)) 504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __radd__(self, other): 514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if isinstance(other, basestring): 524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(other + self.data) 534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(str(other) + self.data) 554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __mul__(self, n): 564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data*n) 574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao __rmul__ = __mul__ 584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __mod__(self, args): 594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data % args) 604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # the following methods are defined in alphabetical order: 624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def capitalize(self): return self.__class__(self.data.capitalize()) 634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def center(self, width, *args): 644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data.center(width, *args)) 654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def count(self, sub, start=0, end=sys.maxint): 664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.data.count(sub, start, end) 674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def decode(self, encoding=None, errors=None): # XXX improve this? 684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if encoding: 694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if errors: 704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data.decode(encoding, errors)) 714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data.decode(encoding)) 734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data.decode()) 754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def encode(self, encoding=None, errors=None): # XXX improve this? 764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if encoding: 774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if errors: 784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data.encode(encoding, errors)) 794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data.encode(encoding)) 814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data.encode()) 834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def endswith(self, suffix, start=0, end=sys.maxint): 844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.data.endswith(suffix, start, end) 854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def expandtabs(self, tabsize=8): 864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data.expandtabs(tabsize)) 874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def find(self, sub, start=0, end=sys.maxint): 884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.data.find(sub, start, end) 894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def index(self, sub, start=0, end=sys.maxint): 904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.data.index(sub, start, end) 914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def isalpha(self): return self.data.isalpha() 924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def isalnum(self): return self.data.isalnum() 934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def isdecimal(self): return self.data.isdecimal() 944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def isdigit(self): return self.data.isdigit() 954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def islower(self): return self.data.islower() 964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def isnumeric(self): return self.data.isnumeric() 974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def isspace(self): return self.data.isspace() 984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def istitle(self): return self.data.istitle() 994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def isupper(self): return self.data.isupper() 1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def join(self, seq): return self.data.join(seq) 1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def ljust(self, width, *args): 1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data.ljust(width, *args)) 1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def lower(self): return self.__class__(self.data.lower()) 1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def lstrip(self, chars=None): return self.__class__(self.data.lstrip(chars)) 1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def partition(self, sep): 1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.data.partition(sep) 1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def replace(self, old, new, maxsplit=-1): 1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data.replace(old, new, maxsplit)) 1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def rfind(self, sub, start=0, end=sys.maxint): 1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.data.rfind(sub, start, end) 1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def rindex(self, sub, start=0, end=sys.maxint): 1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.data.rindex(sub, start, end) 1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def rjust(self, width, *args): 1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data.rjust(width, *args)) 1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def rpartition(self, sep): 1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.data.rpartition(sep) 1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def rstrip(self, chars=None): return self.__class__(self.data.rstrip(chars)) 1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def split(self, sep=None, maxsplit=-1): 1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.data.split(sep, maxsplit) 1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def rsplit(self, sep=None, maxsplit=-1): 1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.data.rsplit(sep, maxsplit) 1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def splitlines(self, keepends=0): return self.data.splitlines(keepends) 1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def startswith(self, prefix, start=0, end=sys.maxint): 1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.data.startswith(prefix, start, end) 1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def strip(self, chars=None): return self.__class__(self.data.strip(chars)) 1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def swapcase(self): return self.__class__(self.data.swapcase()) 1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def title(self): return self.__class__(self.data.title()) 1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def translate(self, *args): 1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self.__class__(self.data.translate(*args)) 1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def upper(self): return self.__class__(self.data.upper()) 1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def zfill(self, width): return self.__class__(self.data.zfill(width)) 1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass MutableString(UserString, collections.MutableSequence): 1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """mutable string objects 1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Python strings are immutable objects. This has the advantage, that 1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao strings may be used as dictionary keys. If this property isn't needed 1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao and you insist on changing string values in place instead, you may cheat 1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao and use MutableString. 1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao But the purpose of this class is an educational one: to prevent 1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao people from inventing their own mutable string class derived 1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao from UserString and than forget thereby to remove (override) the 1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao __hash__ method inherited from UserString. This would lead to 1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao errors that would be very hard to track down. 1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao A faster and better solution is to rewrite your program using lists.""" 1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __init__(self, string=""): 1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao from warnings import warnpy3k 1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao warnpy3k('the class UserString.MutableString has been removed in ' 1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 'Python 3.0', stacklevel=2) 1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data = string 1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # We inherit object.__hash__, so we must deny this explicitly 1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao __hash__ = None 1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __setitem__(self, index, sub): 1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if isinstance(index, slice): 1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if isinstance(sub, UserString): 1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao sub = sub.data 1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif not isinstance(sub, basestring): 1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao sub = str(sub) 1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start, stop, step = index.indices(len(self.data)) 1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if step == -1: 1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start, stop = stop+1, start+1 1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao sub = sub[::-1] 1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif step != 1: 1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # XXX(twouters): I guess we should be reimplementing 1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # the extended slice assignment/deletion algorithm here... 1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError, "invalid step in slicing assignment" 1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start = min(start, stop) 1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data = self.data[:start] + sub + self.data[stop:] 1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if index < 0: 1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao index += len(self.data) 1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if index < 0 or index >= len(self.data): raise IndexError 1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data = self.data[:index] + sub + self.data[index+1:] 1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __delitem__(self, index): 1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if isinstance(index, slice): 1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start, stop, step = index.indices(len(self.data)) 1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if step == -1: 1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start, stop = stop+1, start+1 1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif step != 1: 1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # XXX(twouters): see same block in __setitem__ 1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao raise TypeError, "invalid step in slicing deletion" 1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start = min(start, stop) 1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data = self.data[:start] + self.data[stop:] 1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if index < 0: 1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao index += len(self.data) 1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if index < 0 or index >= len(self.data): raise IndexError 1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data = self.data[:index] + self.data[index+1:] 1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __setslice__(self, start, end, sub): 1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start = max(start, 0); end = max(end, 0) 1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if isinstance(sub, UserString): 1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data = self.data[:start]+sub.data+self.data[end:] 1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif isinstance(sub, basestring): 1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data = self.data[:start]+sub+self.data[end:] 1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data = self.data[:start]+str(sub)+self.data[end:] 2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __delslice__(self, start, end): 2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao start = max(start, 0); end = max(end, 0) 2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data = self.data[:start] + self.data[end:] 2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def immutable(self): 2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return UserString(self.data) 2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __iadd__(self, other): 2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if isinstance(other, UserString): 2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data += other.data 2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif isinstance(other, basestring): 2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data += other 2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data += str(other) 2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self 2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def __imul__(self, n): 2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self.data *= n 2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return self 2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao def insert(self, index, value): 2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao self[index:index] = value 2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__": 2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # execute the regression test to stdout, if called as a script: 2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao import os 2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao called_in_dir, called_as = os.path.split(sys.argv[0]) 2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao called_as, py = os.path.splitext(called_as) 2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if '-q' in sys.argv: 2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao from test import test_support 2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao test_support.verbose = 0 2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao __import__('test.test_' + called_as.lower()) 229