GNU Info

Info Node: (python2.1-ref.info)Additional methods for emulation of sequence types

(python2.1-ref.info)Additional methods for emulation of sequence types


Next: Emulating numeric types Prev: Emulating sequence and mapping types Up: Special method names
Enter node , (file) or (file)node

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 by info2www version 1.2.2.9