Info Node: (python2.1-ref.info)Additional methods for emulation of sequence types
(python2.1-ref.info)Additional methods for emulation of sequence types
Additional methods for emulation of sequence types
--------------------------------------------------
The following methods can be defined to further emulate sequence
objects. Immutable sequences methods should only define
`__getslice__()'; mutable sequences, should define all three three
methods.
`__getslice__(self, i, j)'
_This is deprecated in Python 2.0. Support slice objects as
parameters to the `__getitem__()' method._ Called to implement
evaluation of `SELF[I:J]'. The returned object should be of the
same type as SELF. Note that missing I or J in the slice
expression are replaced by zero or `sys.maxint', respectively. If
negative indexes are used in the slice, the length of the sequence
is added to that index. If the instance does not implement the
`__len__()' method, an `AttributeError' is raised. No guarantee
is made that indexes adjusted this way are not still negative.
Indexes which are greater than the length of the sequence are not
modified. If no `__getslice__()' is found, a slice object is
created instead, and passed to `__getitem__()' instead.
`__setslice__(self, i, j, sequence)'
Called to implement assignment to `SELF[I:J]'. Same notes for I
and J as for `__getslice__()'.
This method is deprecated. If no `__setslice__()' is found, a
slice object is created instead, and passed to `__setitem__()'
instead.
`__delslice__(self, i, j)'
Called to implement deletion of `SELF[I:J]'. Same notes for I and
J as for `__getslice__()'. This method is deprecated. If no
`__delslice__()' is found, a slice object is created instead, and
passed to `__delitem__()' instead.
Notice that these methods are only invoked when a single slice with a
single colon is used, and the slice method is available. For slice
operations involving extended slice notation, or in absence of the
slice methods, `__getitem__()', `__setitem__()' or `__delitem__()' is
called with a slice object as argument.
The following example demonstrate how to make your program or module
compatible with earlier versions of Python (assuming that methods
`__getitem__()', `__setitem__()' and `__delitem__()' support slice
objects as arguments):
class MyClass:
...
def __getitem__(self, index):
...
def __setitem__(self, index, value):
...
def __delitem__(self, index):
...
if sys.version_info < (2, 0):
# They won't be defined if version is at least 2.0 final
def __getslice__(self, i, j):
return self[max(0, i):max(0, j):]
def __setslice__(self, i, j, seq):
self[max(0, i):max(0, j):] = seq
def __delslice__(self, i, j):
del self[max(0, i):max(0, j):]
...
Note the calls to `max()'; these are actually necessary due to the
handling of negative indices before the `__*slice__()' methods are
called. When negative indexes are used, the `__*item__()' methods
receive them as provided, but the `__*slice__()' methods get a "cooked"
form of the index values. For each negative index value, the length of
the sequence is added to the index before calling the method (which may
still result in a negative index); this is the customary handling of
negative indexes by the built-in sequence types, and the `__*item__()'
methods are expected to do this as well. However, since they should
already be doing that, negative indexes cannot be passed in; they must
be be constrained to the bounds of the sequence before being passed to
the `__*item__()' methods. Calling `max(0, i)' conveniently returns
the proper value.
The membership test operators (`in' and `not in') are normally
implemented as iteration loop through the sequence. However, sequence
objects can supply the following special method with a more efficient
implementation:
`__contains__(self, item)'
Called to implement membership test operators. Should return true
if ITEM is in SELF, false otherwise.
automatically generated byinfo2wwwversion 1.2.2.9