14acc25bd392216c4f867a10ca8081e7c8a739676Guido van Rossum"""A more or less complete user-defined wrapper around list objects.""" 2ae3b3a33d85134b51505b3f0f3fdaf6afbffa79bGuido van Rossum 3882a416900ab24d78f398809d1b1a4a119db91e6Raymond Hettingerimport collections 4882a416900ab24d78f398809d1b1a4a119db91e6Raymond Hettinger 5882a416900ab24d78f398809d1b1a4a119db91e6Raymond Hettingerclass UserList(collections.MutableSequence): 66a973c711823f64d0362d0ba4b25ead4162df357Jeremy Hylton def __init__(self, initlist=None): 72a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum self.data = [] 86a973c711823f64d0362d0ba4b25ead4162df357Jeremy Hylton if initlist is not None: 97e47402264cf87b9bbb61fc9ff610af08add7c7bThomas Wouters # XXX should this accept an arbitrary sequence? 106a973c711823f64d0362d0ba4b25ead4162df357Jeremy Hylton if type(initlist) == type(self.data): 116a973c711823f64d0362d0ba4b25ead4162df357Jeremy Hylton self.data[:] = initlist 126a973c711823f64d0362d0ba4b25ead4162df357Jeremy Hylton elif isinstance(initlist, UserList): 136a973c711823f64d0362d0ba4b25ead4162df357Jeremy Hylton self.data[:] = initlist.data[:] 142a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum else: 156a973c711823f64d0362d0ba4b25ead4162df357Jeremy Hylton self.data = list(initlist) 162a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def __repr__(self): return repr(self.data) 17753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum def __lt__(self, other): return self.data < self.__cast(other) 18753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum def __le__(self, other): return self.data <= self.__cast(other) 19753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum def __eq__(self, other): return self.data == self.__cast(other) 20753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum def __ne__(self, other): return self.data != self.__cast(other) 21753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum def __gt__(self, other): return self.data > self.__cast(other) 22753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum def __ge__(self, other): return self.data >= self.__cast(other) 23753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum def __cast(self, other): 24753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum if isinstance(other, UserList): return other.data 25753a68e2cc671a525c02e4cd6d60412704275f3eGuido van Rossum else: return other 262a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def __cmp__(self, other): 270163d6d6ef85dd0cd0ea4ea6dce4b867e39cd6b9Martin v. Löwis return cmp(self.data, self.__cast(other)) 2848361f5cbf419cce361fd1aa0389d6304ad167dbNick Coghlan __hash__ = None # Mutable sequence, so not hashable 297b393fc0379d901da657e8fb870171cca71f94f4Tim Peters def __contains__(self, item): return item in self.data 302a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def __len__(self): return len(self.data) 312a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def __getitem__(self, i): return self.data[i] 322a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def __setitem__(self, i, item): self.data[i] = item 332a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def __delitem__(self, i): del self.data[i] 342a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def __getslice__(self, i, j): 352a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum i = max(i, 0); j = max(j, 0) 36cc773d3b11967b36684b0681e54ed6388bf7370cFred Drake return self.__class__(self.data[i:j]) 372a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def __setslice__(self, i, j, other): 382a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum i = max(i, 0); j = max(j, 0) 392a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum if isinstance(other, UserList): 402a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum self.data[i:j] = other.data 412a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum elif isinstance(other, type(self.data)): 422a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum self.data[i:j] = other 432a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum else: 442a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum self.data[i:j] = list(other) 452a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def __delslice__(self, i, j): 462a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum i = max(i, 0); j = max(j, 0) 472a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum del self.data[i:j] 482a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def __add__(self, other): 492a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum if isinstance(other, UserList): 502a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum return self.__class__(self.data + other.data) 512a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum elif isinstance(other, type(self.data)): 522a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum return self.__class__(self.data + other) 532a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum else: 542a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum return self.__class__(self.data + list(other)) 552a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def __radd__(self, other): 562a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum if isinstance(other, UserList): 572a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum return self.__class__(other.data + self.data) 582a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum elif isinstance(other, type(self.data)): 592a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum return self.__class__(other + self.data) 602a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum else: 612a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum return self.__class__(list(other) + self.data) 62104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters def __iadd__(self, other): 63104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters if isinstance(other, UserList): 64104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters self.data += other.data 65104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters elif isinstance(other, type(self.data)): 66104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters self.data += other 67104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters else: 68104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters self.data += list(other) 69104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters return self 702a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def __mul__(self, n): 712a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum return self.__class__(self.data*n) 722a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum __rmul__ = __mul__ 73104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters def __imul__(self, n): 74104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters self.data *= n 75104a7bcc28f96c6192815e82971d660c9910c16bThomas Wouters return self 762a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def append(self, item): self.data.append(item) 772a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def insert(self, i, item): self.data.insert(i, item) 782a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def pop(self, i=-1): return self.data.pop(i) 792a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def remove(self, item): self.data.remove(item) 802a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def count(self, item): return self.data.count(item) 81d05abdec7b2620449369bb44a617684463ba50acRaymond Hettinger def index(self, item, *args): return self.data.index(item, *args) 822a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def reverse(self): self.data.reverse() 836b59f5f3fd9bdf00875a7cead15f423fa1c2f910Raymond Hettinger def sort(self, *args, **kwds): self.data.sort(*args, **kwds) 842a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum def extend(self, other): 852a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum if isinstance(other, UserList): 862a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum self.data.extend(other.data) 872a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum else: 882a340b38894e6c55dd0feb2b967d1e3c0dcda174Guido van Rossum self.data.extend(other) 89