\chapter{Data model}

\section{Objects, values and types}

\dfn{Objects} are Python's abstraction for data.  All data in a Python
program is represented by objects or by relations between objects.
(In a sense, and in conformance to Von Neumann's model of a
``stored program computer'', code is also represented by objects.)
\index{object}
\index{data}

Every object has an identity, a type and a value.  An object's
\emph{identity} never changes once it has been created; you may think
of it as the object's address in memory.  An object's \dfn{type} is
also unchangeable.  It determines the operations that an object
supports (e.g.\ ``does it have a length?'') and also defines the
possible values for objects of that type.  The \emph{value} of some
objects can change.  Objects whose value can change are said to be
\emph{mutable}; objects whose value is unchangeable once they are
created are called \emph{immutable}.  The type determines an object's
(im)mutability.
\index{identity of an object}
\index{value of an object}
\index{type of an object}
\index{mutable object}
\index{immutable object}

Objects are never explicitly destroyed; however, when they become
unreachable they may be garbage-collected.  An implementation is
allowed to delay garbage collection or omit it altogether --- it is a
matter of implementation quality how garbage collection is
implemented, as long as no objects are collected that are still
reachable.  (Implementation note: the current implementation uses a
reference-counting scheme which collects most objects as soon as they
become unreachable, but never collects garbage containing circular
references.)
\index{garbage collection}
\index{reference counting}
\index{unreachable object}

Note that the use of the implementation's tracing or debugging
facilities may keep objects alive that would normally be collectable.

Some objects contain references to ``external'' resources such as open
files or windows.  It is understood that these resources are freed
when the object is garbage-collected, but since garbage collection is
not guaranteed to happen, such objects also provide an explicit way to
release the external resource, usually a \method{close()} method.
Programs are strongly recommended to always explicitly close such
objects.

Some objects contain references to other objects; these are called
\emph{containers}.  Examples of containers are tuples, lists and
dictionaries.  The references are part of a container's value.  In
most cases, when we talk about the value of a container, we imply the
values, not the identities of the contained objects; however, when we
talk about the (im)mutability of a container, only the identities of
the immediately contained objects are implied.  (So, if an immutable
container contains a reference to a mutable object, its value changes
if that mutable object is changed.)
\index{container}

Types affect almost all aspects of objects' lives.  Even the meaning
of object identity is affected in some sense: for immutable types,
operations that compute new values may actually return a reference to
any existing object with the same type and value, while for mutable
objects this is not allowed.  E.g. after

\begin{verbatim}
a = 1; b = 1; c = []; d = []
\end{verbatim}

\code{a} and \code{b} may or may not refer to the same object with the
value one, depending on the implementation, but \code{c} and \code{d}
are guaranteed to refer to two different, unique, newly created empty
lists.

\section{The standard type hierarchy} \label{types}

Below is a list of the types that are built into Python.  Extension
modules written in C can define additional types.  Future versions of
Python may add types to the type hierarchy (e.g.\ rational or complex
numbers, efficiently stored arrays of integers, etc.).
\index{type}
\indexii{data}{type}
\indexii{type}{hierarchy}
\indexii{extension}{module}
\indexii{C}{language}

Some of the type descriptions below contain a paragraph listing
`special attributes'.  These are attributes that provide access to the
implementation and are not intended for general use.  Their definition
may change in the future.  There are also some `generic' special
attributes, not listed with the individual objects: \member{__methods__}
is a list of the method names of a built-in object, if it has any;
\member{__members__} is a list of the data attribute names of a built-in
object, if it has any.
\index{attribute}
\indexii{special}{attribute}
\indexiii{generic}{special}{attribute}
\ttindex{__methods__}
\ttindex{__members__}

\begin{description}

\item[None]
This type has a single value.  There is a single object with this value.
This object is accessed through the built-in name \code{None}.
It is returned from functions that don't explicitly return an object.
\ttindex{None}
\obindex{None@{\tt None}}

\item[Numbers]
These are created by numeric literals and returned as results by
arithmetic operators and arithmetic built-in functions.  Numeric
objects are immutable; once created their value never changes.  Python
numbers are of course strongly related to mathematical numbers, but
subject to the limitations of numerical representation in computers.
\obindex{number}
\obindex{numeric}

Python distinguishes between integers and floating point numbers:

\begin{description}
\item[Integers]
These represent elements from the mathematical set of whole numbers.
\obindex{integer}

There are two types of integers:

\begin{description}

\item[Plain integers]
These represent numbers in the range -2147483648 through 2147483647.
(The range may be larger on machines with a larger natural word
size, but not smaller.)
When the result of an operation falls outside this range, the
exception \exception{OverflowError} is raised.
For the purpose of shift and mask operations, integers are assumed to
have a binary, 2's complement notation using 32 or more bits, and
hiding no bits from the user (i.e., all 4294967296 different bit
patterns correspond to different values).
\obindex{plain integer}
\withsubitem{(built-in exception)}{\ttindex{OverflowError}}

\item[Long integers]
These represent numbers in an unlimited range, subject to available
(virtual) memory only.  For the purpose of shift and mask operations,
a binary representation is assumed, and negative numbers are
represented in a variant of 2's complement which gives the illusion of
an infinite string of sign bits extending to the left.
\obindex{long integer}

\end{description} % Integers

The rules for integer representation are intended to give the most
meaningful interpretation of shift and mask operations involving
negative integers and the least surprises when switching between the
plain and long integer domains.  For any operation except left shift,
if it yields a result in the plain integer domain without causing
overflow, it will yield the same result in the long integer domain or
when using mixed operands.
\indexii{integer}{representation}

\item[Floating point numbers]
These represent machine-level double precision floating point numbers.  
You are at the mercy of the underlying machine architecture and
C implementation for the accepted range and handling of overflow.
\obindex{floating point}
\indexii{floating point}{number}
\indexii{C}{language}

\end{description} % Numbers

\item[Sequences]
These represent finite ordered sets indexed by natural numbers.
The built-in function \function{len()}\bifuncindex{len} returns the
number of elements of a sequence.  When this number is \var{n}, the
index set contains the numbers 0, 1, \ldots, \var{n}-1.  Element
\var{i} of sequence \var{a} is selected by \code{\var{a}[\var{i}]}.
\obindex{seqence}
\index{index operation}
\index{item selection}
\index{subscription}

Sequences also support slicing: \code{\var{a}[\var{i}:\var{j}]}
selects all elements with index \var{k} such that \var{i} \code{<=}
\var{k} \code{<} \var{j}.  When used as an expression, a slice is a
sequence of the same type --- this implies that the index set is
renumbered so that it starts at 0 again.
\index{slicing}

Sequences are distinguished according to their mutability:

\begin{description}
%
\item[Immutable sequences]
An object of an immutable sequence type cannot change once it is
created.  (If the object contains references to other objects,
these other objects may be mutable and may be changed; however
the collection of objects directly referenced by an immutable object
cannot change.)
\obindex{immutable sequence}
\obindex{immutable}

The following types are immutable sequences:

\begin{description}

\item[Strings]
The elements of a string are characters.  There is no separate
character type; a character is represented by a string of one element.
Characters represent (at least) 8-bit bytes.  The built-in
functions \function{chr()}\bifuncindex{chr} and
\function{ord()}\bifuncindex{ord} convert between characters and
nonnegative integers representing the byte values.  Bytes with the
values 0-127 represent the corresponding \ASCII{} values.  The string
data type is also used to represent arrays of bytes, e.g.\ to hold data
read from a file.
\obindex{string}
\index{character}
\index{byte}
\index{ASCII@\ASCII{}}

(On systems whose native character set is not \ASCII{}, strings may use
EBCDIC in their internal representation, provided the functions
\function{chr()} and \function{ord()} implement a mapping between \ASCII{} and
EBCDIC, and string comparison preserves the \ASCII{} order.
Or perhaps someone can propose a better rule?)
\index{ASCII@\ASCII{}}
\index{EBCDIC}
\index{character set}
\indexii{string}{comparison}
\bifuncindex{chr}
\bifuncindex{ord}

\item[Tuples]
The elements of a tuple are arbitrary Python objects.
Tuples of two or more elements are formed by comma-separated lists
of expressions.  A tuple of one element (a `singleton') can be formed
by affixing a comma to an expression (an expression by itself does
not create a tuple, since parentheses must be usable for grouping of
expressions).  An empty tuple can be formed by enclosing `nothing' in
parentheses.
\obindex{tuple}
\indexii{singleton}{tuple}
\indexii{empty}{tuple}

\end{description} % Immutable sequences

\item[Mutable sequences]
Mutable sequences can be changed after they are created.  The
subscription and slicing notations can be used as the target of
assignment and \keyword{del} (delete) statements.
\obindex{mutable sequece}
\obindex{mutable}
\indexii{assignment}{statement}
\index{delete}
\stindex{del}
\index{subscription}
\index{slicing}

There is currently a single mutable sequence type:

\begin{description}

\item[Lists]
The elements of a list are arbitrary Python objects.  Lists are formed
by placing a comma-separated list of expressions in square brackets.
(Note that there are no special cases needed to form lists of length 0
or 1.)
\obindex{list}

\end{description} % Mutable sequences

\end{description} % Sequences

\item[Mapping types]
These represent finite sets of objects indexed by arbitrary index sets.
The subscript notation \code{a[k]} selects the element indexed
by \code{k} from the mapping \code{a}; this can be used in
expressions and as the target of assignments or \keyword{del} statements.
The built-in function \function{len()} returns the number of elements
in a mapping.
\bifuncindex{len}
\index{subscription}
\obindex{mapping}

There is currently a single mapping type:

\begin{description}

\item[Dictionaries]
These represent finite sets of objects indexed by almost arbitrary
values.  The only types of values not acceptable as keys are values
containing lists or dictionaries or other mutable types that are
compared by value rather than by object identity --- the reason being
that the implementation requires that a key's hash value be constant.
Numeric types used for keys obey the normal rules for numeric
comparison: if two numbers compare equal (e.g.\ \code{1} and
\code{1.0}) then they can be used interchangeably to index the same
dictionary entry.

Dictionaries are mutable; they are created by the \code{...}
notation (see section \ref{dict}).
\obindex{dictionary}
\obindex{mutable}

\end{description} % Mapping types

\item[Callable types]
These are the types to which the function call (invocation) operation,
written as \code{function(argument, argument, ...)}, can be applied:
\indexii{function}{call}
\index{invocation}
\indexii{function}{argument}
\obindex{callable}

\begin{description}

\item[User-defined functions]
A user-defined function object is created by a function definition
(see section \ref{function}).  It should be called with an argument
list containing the same number of items as the function's formal
parameter list.
\indexii{user-defined}{function}
\obindex{function}
\obindex{user-defined function}

Special read-only attributes: \member{func_code} is the code object
representing the compiled function body, and \member{func_globals} is (a
reference to) the dictionary that holds the function's global
variables --- it implements the global name space of the module in
which the function was defined.
\ttindex{func_code}
\ttindex{func_globals}
\indexii{global}{name space}

\item[User-defined methods]
A user-defined method (a.k.a. \dfn{object closure}) is a pair of a
class instance object and a user-defined function.  It should be
called with an argument list containing one item less than the number
of items in the function's formal parameter list.  When called, the
class instance becomes the first argument, and the call arguments are
shifted one to the right.
\obindex{method}
\obindex{user-defined method}
\indexii{user-defined}{method}
\index{object closure}

Special read-only attributes: \member{im_self} is the class instance
object, \member{im_func} is the function object.
\ttindex{im_func}
\ttindex{im_self}

\item[Built-in functions]
A built-in function object is a wrapper around a C function.  Examples
of built-in functions are \function{len()} and \function{math.sin()}.  There
are no special attributes.  The number and type of the arguments are
determined by the C function.
\obindex{built-in function}
\obindex{function}
\indexii{C}{language}

\item[Built-in methods]
This is really a different disguise of a built-in function, this time
containing an object passed to the \C{} function as an implicit extra
argument.  An example of a built-in method is \code{\var{list}.append()} if
\var{list} is a list object.
\obindex{built-in method}
\obindex{method}
\indexii{built-in}{method}

\item[Classes]
Class objects are described below.  When a class object is called as a
function, a new class instance (also described below) is created and
returned.  This implies a call to the class's \method{__init__()} method
if it has one.  Any arguments are passed on to the \method{__init__()}
method --- if there is no \method{__init__()} method, the class must be called
without arguments.
\ttindex{__init__}
\obindex{class}
\obindex{class instance}
\obindex{instance}
\indexii{class object}{call}

\end{description}

\item[Modules]
Modules are imported by the \keyword{import} statement (see section
\ref{import}).  A module object is a container for a module's name
space, which is a dictionary (the same dictionary as referenced by the
\member{func_globals} attribute of functions defined in the module).
Module attribute references are translated to lookups in this
dictionary.  A module object does not contain the code object used to
initialize the module (since it isn't needed once the initialization
is done).
\stindex{import}
\obindex{module}

Attribute assignment update the module's name space dictionary.

Special read-only attribute: \member{__dict__} yields the module's name
space as a dictionary object.  Predefined attributes: \member{__name__}
yields the module's name as a string object; \member{__doc__} yields the
module's documentation string as a string object, or
\code{None} if no documentation string was found.
\ttindex{__dict__}
\ttindex{__name__}
\ttindex{__doc__}
\indexii{module}{name space}

\item[Classes]
Class objects are created by class definitions (see section
\ref{class}).  A class is a container for a dictionary containing the
class's name space.  Class attribute references are translated to
lookups in this dictionary.  When an attribute name is not found
there, the attribute search continues in the base classes.  The search
is depth-first, left-to-right in the order of their occurrence in the
base class list.
\obindex{class}
\obindex{class instance}
\obindex{instance}
\indexii{class object}{call}
\index{container}
\obindex{dictionary}
\indexii{class}{attribute}

Class attribute assignments update the class's dictionary, never the
dictionary of a base class.
\indexiii{class}{attribute}{assignment}

A class can be called as a function to yield a class instance (see
above).
\indexii{class object}{call}

Special read-only attributes: \member{__dict__} yields the dictionary
containing the class's name space; \member{__bases__} yields a tuple
(possibly empty or a singleton) containing the base classes, in the
order of their occurrence in the base class list.
\ttindex{__dict__}
\ttindex{__bases__}

\item[Class instances]
A class instance is created by calling a class object as a
function.  A class instance has a dictionary in which
attribute references are searched.  When an attribute is not found
there, and the instance's class has an attribute by that name, and
that class attribute is a user-defined function (and in no other
cases), the instance attribute reference yields a user-defined method
object (see above) constructed from the instance and the function.
\obindex{class instance}
\obindex{instance}
\indexii{class}{instance}
\indexii{class instance}{attribute}

Attribute assignments update the instance's dictionary.
\indexiii{class instance}{attribute}{assignment}

Class instances can pretend to be numbers, sequences, or mappings if
they have methods with certain special names.  These are described in
section \ref{specialnames}.
\obindex{number}
\obindex{sequence}
\obindex{mapping}

Special read-only attributes: \member{__dict__} yields the attribute
dictionary; \member{__class__} yields the instance's class.
\ttindex{__dict__}
\ttindex{__class__}

\item[Files]
A file object represents an open file.  (It is a wrapper around a \C{}
\code{stdio} file pointer.)  File objects are created by the
\function{open()} built-in function, and also by \function{posix.popen()} and
the \method{makefile()} method of socket objects.  \code{sys.stdin},
\code{sys.stdout} and \code{sys.stderr} are file objects corresponding
to the interpreter's standard input, output and error streams.
See the \emph{Python Library Reference} for methods of file objects
and other details.
\obindex{file}
\indexii{C}{language}
\index{stdio}
\bifuncindex{open}
\bifuncindex{popen}
\bifuncindex{makefile}
\ttindex{stdin}
\ttindex{stdout}
\ttindex{stderr}
\ttindex{sys.stdin}
\ttindex{sys.stdout}
\ttindex{sys.stderr}

\item[Internal types]
A few types used internally by the interpreter are exposed to the user.
Their definition may change with future versions of the interpreter,
but they are mentioned here for completeness.
\index{internal type}
\index{types, internal}

\begin{description}

\item[Code objects]
Code objects represent ``pseudo-compiled'' executable Python code.
The difference between a code
object and a function object is that the function object contains an
explicit reference to the function's context (the module in which it
was defined) while a code object contains no context.
\obindex{code}

Special read-only attributes: \member{co_code} is a string representing
the sequence of instructions; \member{co_consts} is a list of literals
used by the code; \member{co_names} is a list of names (strings) used by
the code; \member{co_filename} is the filename from which the code was
compiled.  (To find out the line numbers, you would have to decode the
instructions; the standard library module
\module{dis}\refstmodindex{dis} contains an example of how to do
this.)
\ttindex{co_code}
\ttindex{co_consts}
\ttindex{co_names}
\ttindex{co_filename}

\item[Frame objects]
Frame objects represent execution frames.  They may occur in traceback
objects (see below).
\obindex{frame}

Special read-only attributes: \member{f_back} is to the previous
stack frame (towards the caller), or \code{None} if this is the bottom
stack frame; \member{f_code} is the code object being executed in this
frame; \member{f_globals} is the dictionary used to look up global
variables; \member{f_locals} is used for local variables;
\member{f_lineno} gives the line number and \member{f_lasti} gives the
precise instruction (this is an index into the instruction string of
the code object).
\ttindex{f_back}
\ttindex{f_code}
\ttindex{f_globals}
\ttindex{f_locals}
\ttindex{f_lineno}
\ttindex{f_lasti}

\item[Traceback objects] \label{traceback}
Traceback objects represent a stack trace of an exception.  A
traceback object is created when an exception occurs.  When the search
for an exception handler unwinds the execution stack, at each unwound
level a traceback object is inserted in front of the current
traceback.  When an exception handler is entered
(see also section \ref{try}), the stack trace is
made available to the program as \code{sys.exc_traceback}.  When the
program contains no suitable handler, the stack trace is written
(nicely formatted) to the standard error stream; if the interpreter is
interactive, it is also made available to the user as
\code{sys.last_traceback}.
\obindex{traceback}
\indexii{stack}{trace}
\indexii{exception}{handler}
\indexii{execution}{stack}
\ttindex{exc_traceback}
\ttindex{last_traceback}
\ttindex{sys.exc_traceback}
\ttindex{sys.last_traceback}

Special read-only attributes: \member{tb_next} is the next level in the
stack trace (towards the frame where the exception occurred), or
\code{None} if there is no next level; \member{tb_frame} points to the
execution frame of the current level; \member{tb_lineno} gives the line
number where the exception occurred; \member{tb_lasti} indicates the
precise instruction.  The line number and last instruction in the
traceback may differ from the line number of its frame object if the
exception occurred in a \keyword{try} statement with no matching
except clause or with a finally clause.
\ttindex{tb_next}
\ttindex{tb_frame}
\ttindex{tb_lineno}
\ttindex{tb_lasti}
\stindex{try}

\end{description} % Internal types

\end{description} % Types


\section{Special method names} \label{specialnames}

A class can implement certain operations that are invoked by special
syntax (such as subscription or arithmetic operations) by defining
methods with special names.  For instance, if a class defines a
method named \method{__getitem__()}, and \code{x} is an instance of this
class, then \code{x[i]} is equivalent to \code{x.__getitem__(i)}.
(The reverse is not true --- if \code{x} is a list object,
\code{x.__getitem__(i)} is not equivalent to \code{x[i]}.)
\ttindex{__getitem__}

Except for \method{__repr__()}, \method{__str__()} and \method{__cmp__()},
attempts to execute an
operation raise an exception when no appropriate method is defined.
For \method{__repr__()}, the default is to return a string describing the
object's class and address.
For \method{__cmp__()}, the default is to compare instances based on their
address.
For \method{__str__()}, the default is to use \method{__repr__()}.
\ttindex{__repr__}
\ttindex{__str__}
\ttindex{__cmp__}


\subsection{Special methods for any type}

\begin{description}

\item[{\tt __init__(self, args...)}]
Called when the instance is created.  The arguments are those passed
to the class constructor expression.  If a base class has an
\code{__init__} method the derived class's \code{__init__} method must
explicitly call it to ensure proper initialization of the base class
part of the instance.
\ttindex{__init__}
\indexii{class}{constructor}


\item[{\tt __del__(self)}]
Called when the instance is about to be destroyed.  If a base class
has a \method{__del__()} method the derived class's \method{__del__()} method
must explicitly call it to ensure proper deletion of the base class
part of the instance.  Note that it is possible for the \method{__del__()}
method to postpone destruction of the instance by creating a new
reference to it.  It may then be called at a later time when this new
reference is deleted.  It is not guaranteed that
\method{__del__()} methods are called for objects that still exist when
the interpreter exits.
If an exception occurs in a \method{__del__()} method, it is ignored, and
a warning is printed on stderr.
\ttindex{__del__}
\stindex{del}

Note that \code{del x} doesn't directly call \code{x.__del__()} --- the
former decrements the reference count for \code{x} by one, but
\code{x.__del__()} is only called when its reference count reaches zero.

\strong{Warning:} due to the precarious circumstances under which
\code{__del__()} methods are executed, exceptions that occur during
their execution are \emph{ignored}.

\item[{\tt __repr__(self)}]
Called by the \function{repr()} built-in function and by string conversions
(reverse or backward quotes) to compute the string representation of an object.
\ttindex{__repr__}
\bifuncindex{repr}
\indexii{string}{conversion}
\indexii{reverse}{quotes}
\indexii{backward}{quotes}
\index{back-quotes}

\item[{\tt __str__(self)}]
Called by the \function{str()} built-in function and by the \keyword{print}
statement compute the string representation of an object.
\ttindex{__str__}
\bifuncindex{str}
\stindex{print}

\item[{\tt __cmp__(self, other)}]
Called by all comparison operations.  Should return \code{-1} if
\code{self < other},  \code{0} if \code{self == other}, \code{+1} if
\code{self > other}.  If no \method{__cmp__()} operation is defined, class
instances are compared by object identity (``address'').
(Implementation note: due to limitations in the interpreter,
exceptions raised by comparisons are ignored, and the objects will be
considered equal in this case.)
\ttindex{__cmp__}
\bifuncindex{cmp}
\index{comparisons}

\item[{\tt __hash__(self)}]
Called for the key object for dictionary operations,
and by the built-in function
\function{hash()}\bifuncindex{hash}.  Should return a 32-bit integer
usable as a hash value
for dictionary operations.  The only required property is that objects
which compare equal have the same hash value; it is advised to somehow
mix together (e.g.\ using exclusive or) the hash values for the
components of the object that also play a part in comparison of
objects.  If a class does not define a \method{__cmp__()} method it should
not define a \method{__hash__()} operation either; if it defines
\method{__cmp__()} but not \method{__hash__()} its instances will not be
usable as dictionary keys.  If a class defines mutable objects and
implements a \method{__cmp__()} method it should not implement
\method{__hash__()}, since the dictionary implementation assumes that a
key's hash value is a constant.
\obindex{dictionary}
\ttindex{__cmp__}
\ttindex{__hash__}

\item[{\tt __call__(self, *args)}]
Called when the instance is ``called'' as a function.
\ttindex{__call__}
\indexii{call}{instance}

\end{description}


\subsection{Special methods for attribute access}

The following methods can be used to change the meaning of attribute
access for class instances.

\begin{description}

\item[{\tt __getattr__(self, name)}]
Called when an attribute lookup has not found the attribute in the
usual places (i.e. it is not an instance attribute nor is it found in
the class tree for \code{self}).  \code{name} is the attribute name.
\ttindex{__getattr__}

Note that if the attribute is found through the normal mechanism,
\code{__getattr__} is not called.  (This is an asymmetry between
\code{__getattr__} and \code{__setattr__}.)
This is done both for efficiency reasons and because otherwise
\code{__getattr__} would have no way to access other attributes of the
instance.
Note that at least for instance variables, \code{__getattr__} can fake
total control by simply not inserting any values in the instance
attribute dictionary.
\ttindex{__setattr__}

\item[{\tt __setattr__(self, name, value)}]
Called when an attribute assignment is attempted.  This is called
instead of the normal mechanism (i.e. store the value as an instance
attribute).  \code{name} is the attribute name, \code{value} is the
value to be assigned to it.
\ttindex{__setattr__}

If \code{__setattr__} wants to assign to an instance attribute, it
should not simply execute \code{self.\var{name} = value} --- this would
cause a recursive call.  Instead, it should insert the value in the
dictionary of instance attributes, e.g.\ \code{self.__dict__[name] =
value}.
\ttindex{__dict__}

\item[{\tt __delattr__(self, name)}]
Like \code{__setattr__} but for attribute deletion instead of
assignment.
\ttindex{__delattr__}

\end{description}


\subsection{Special methods for sequence and mapping types}

\begin{description}

\item[{\tt __len__(self)}]
Called to implement the built-in function \function{len()}.  Should return
the length of the object, an integer \code{>=} 0.  Also, an object
whose \method{__len__()} method returns 0 is considered to be false in a
Boolean context.
\ttindex{__len__}

\item[{\tt __getitem__(self, key)}]
Called to implement evaluation of \code{self[key]}.  Note that the
special interpretation of negative keys (if the class wishes to
emulate a sequence type) is up to the \method{__getitem__()} method.
\ttindex{__getitem__}

\item[{\tt __setitem__(self, key, value)}]
Called to implement assignment to \code{self[key]}.  Same note as for
\method{__getitem__()}.
\ttindex{__setitem__}

\item[{\tt __delitem__(self, key)}]
Called to implement deletion of \code{self[key]}.  Same note as for
\method{__getitem__()}.
\ttindex{__delitem__}

\end{description}


\subsection{Special methods for sequence types}

\begin{description}

\item[{\tt __getslice__(self, i, j)}]
Called to implement evaluation of \code{self[i:j]}.  Note that missing
\code{i} or \code{j} are replaced by 0 or \code{len(self)},
respectively, and \code{len(self)} has been added (once) to originally
negative \code{i} or \code{j} by the time this function is called
(unlike for \method{__getitem__()}).
\ttindex{__getslice__}

\item[{\tt __setslice__(self, i, j, sequence)}]
Called to implement assignment to \code{self[i:j]}.  Same notes as for
\method{__getslice__()}.
\ttindex{__setslice__}

\item[{\tt __delslice__(self, i, j)}]
Called to implement deletion of \code{self[i:j]}.  Same notes as for
\method{__getslice__()}.
\ttindex{__delslice__}

\end{description}


\subsection{Special methods for numeric types}

\begin{description}

\item[{\tt __add__(self, other)}]\itemjoin
\item[{\tt __sub__(self, other)}]\itemjoin
\item[{\tt __mul__(self, other)}]\itemjoin
\item[{\tt __div__(self, other)}]\itemjoin
\item[{\tt __mod__(self, other)}]\itemjoin
\item[{\tt __divmod__(self, other)}]\itemjoin
\item[{\tt __pow__(self, other)}]\itemjoin
\item[{\tt __lshift__(self, other)}]\itemjoin
\item[{\tt __rshift__(self, other)}]\itemjoin
\item[{\tt __and__(self, other)}]\itemjoin
\item[{\tt __xor__(self, other)}]\itemjoin
\item[{\tt __or__(self, other)}]\itembreak
Called to implement the binary arithmetic operations (\code{+},
\code{-}, \code{*}, \code{/}, \code{\%}, \function{divmod()}, \function{pow()},
\code{<<}, \code{>>}, \code{\&}, \code{\^}, \code{|}).
\ttindex{__or__}
\ttindex{__xor__}
\ttindex{__and__}
\ttindex{__rshift__}
\ttindex{__lshift__}
\ttindex{__pow__}
\ttindex{__divmod__}
\ttindex{__mod__}
\ttindex{__div__}
\ttindex{__mul__}
\ttindex{__sub__}
\ttindex{__add__}

\item[{\tt __neg__(self)}]\itemjoin
\item[{\tt __pos__(self)}]\itemjoin
\item[{\tt __abs__(self)}]\itemjoin
\item[{\tt __invert__(self)}]\itembreak
Called to implement the unary arithmetic operations (\code{-}, \code{+},
\function{abs()} and \code{~}).
\ttindex{__invert__}
\ttindex{__abs__}
\ttindex{__pos__}
\ttindex{__neg__}

\item[{\tt __nonzero__(self)}]
Called to implement boolean testing; should return 0 or 1.  An
alternative name for this method is \method{__len__()}.
\ttindex{__nonzero__}

\item[{\tt __coerce__(self, other)}]
Called to implement ``mixed-mode'' numeric arithmetic.  Should either
return a tuple containing self and other converted to a common numeric
type, or None if no way of conversion is known.  When the common type
would be the type of other, it is sufficient to return None, since the
interpreter will also ask the other object to attempt a coercion (but
sometimes, if the implementation of the other type cannot be changed,
it is useful to do the conversion to the other type here).
\ttindex{__coerce__}

Note that this method is not called to coerce the arguments to \code{+}
and \code{*}, because these are also used to implement sequence
concatenation and repetition, respectively.  Also note that, for the
same reason, in \code{\var{n} * \var{x}}, where \var{n} is a built-in
number and \var{x} is an instance, a call to
\code{\var{x}.__mul__(\var{n})} is made.%
\footnote{The interpreter should really distinguish between
user-defined classes implementing sequences, mappings or numbers, but
currently it doesn't --- hence this strange exception.}
\ttindex{__mul__}

\item[{\tt __int__(self)}]\itemjoin
\item[{\tt __long__(self)}]\itemjoin
\item[{\tt __float__(self)}]\itembreak
Called to implement the built-in functions \function{int()}, \function{long()}
and \function{float()}.  Should return a value of the appropriate type.
\ttindex{__float__}
\ttindex{__long__}
\ttindex{__int__}

\item[{\tt __oct__(self)}]\itemjoin
\item[{\tt __hex__(self)}]\itembreak
Called to implement the built-in functions \function{oct()} and
\function{hex()}.  Should return a string value.
\ttindex{__hex__}
\ttindex{__oct__}

\end{description}
