1781 lines
76 KiB
TeX
1781 lines
76 KiB
TeX
\chapter{Object Implementation Support \label{newTypes}}
|
|
|
|
|
|
This chapter describes the functions, types, and macros used when
|
|
defining new object types.
|
|
|
|
|
|
\section{Allocating Objects on the Heap
|
|
\label{allocating-objects}}
|
|
|
|
\begin{cfuncdesc}{PyObject*}{_PyObject_New}{PyTypeObject *type}
|
|
\end{cfuncdesc}
|
|
|
|
\begin{cfuncdesc}{PyVarObject*}{_PyObject_NewVar}{PyTypeObject *type, Py_ssize_t size}
|
|
\end{cfuncdesc}
|
|
|
|
\begin{cfuncdesc}{void}{_PyObject_Del}{PyObject *op}
|
|
\end{cfuncdesc}
|
|
|
|
\begin{cfuncdesc}{PyObject*}{PyObject_Init}{PyObject *op,
|
|
PyTypeObject *type}
|
|
Initialize a newly-allocated object \var{op} with its type and
|
|
initial reference. Returns the initialized object. If \var{type}
|
|
indicates that the object participates in the cyclic garbage
|
|
detector, it is added to the detector's set of observed objects.
|
|
Other fields of the object are not affected.
|
|
\end{cfuncdesc}
|
|
|
|
\begin{cfuncdesc}{PyVarObject*}{PyObject_InitVar}{PyVarObject *op,
|
|
PyTypeObject *type, Py_ssize_t size}
|
|
This does everything \cfunction{PyObject_Init()} does, and also
|
|
initializes the length information for a variable-size object.
|
|
\end{cfuncdesc}
|
|
|
|
\begin{cfuncdesc}{\var{TYPE}*}{PyObject_New}{TYPE, PyTypeObject *type}
|
|
Allocate a new Python object using the C structure type \var{TYPE}
|
|
and the Python type object \var{type}. Fields not defined by the
|
|
Python object header are not initialized; the object's reference
|
|
count will be one. The size of the memory
|
|
allocation is determined from the \member{tp_basicsize} field of the
|
|
type object.
|
|
\end{cfuncdesc}
|
|
|
|
\begin{cfuncdesc}{\var{TYPE}*}{PyObject_NewVar}{TYPE, PyTypeObject *type,
|
|
Py_ssize_t size}
|
|
Allocate a new Python object using the C structure type \var{TYPE}
|
|
and the Python type object \var{type}. Fields not defined by the
|
|
Python object header are not initialized. The allocated memory
|
|
allows for the \var{TYPE} structure plus \var{size} fields of the
|
|
size given by the \member{tp_itemsize} field of \var{type}. This is
|
|
useful for implementing objects like tuples, which are able to
|
|
determine their size at construction time. Embedding the array of
|
|
fields into the same allocation decreases the number of allocations,
|
|
improving the memory management efficiency.
|
|
\end{cfuncdesc}
|
|
|
|
\begin{cfuncdesc}{void}{PyObject_Del}{PyObject *op}
|
|
Releases memory allocated to an object using
|
|
\cfunction{PyObject_New()} or \cfunction{PyObject_NewVar()}. This
|
|
is normally called from the \member{tp_dealloc} handler specified in
|
|
the object's type. The fields of the object should not be accessed
|
|
after this call as the memory is no longer a valid Python object.
|
|
\end{cfuncdesc}
|
|
|
|
\begin{cfuncdesc}{PyObject*}{Py_InitModule}{char *name,
|
|
PyMethodDef *methods}
|
|
Create a new module object based on a name and table of functions,
|
|
returning the new module object.
|
|
|
|
\versionchanged[Older versions of Python did not support \NULL{} as
|
|
the value for the \var{methods} argument]{2.3}
|
|
\end{cfuncdesc}
|
|
|
|
\begin{cfuncdesc}{PyObject*}{Py_InitModule3}{char *name,
|
|
PyMethodDef *methods,
|
|
char *doc}
|
|
Create a new module object based on a name and table of functions,
|
|
returning the new module object. If \var{doc} is non-\NULL, it will
|
|
be used to define the docstring for the module.
|
|
|
|
\versionchanged[Older versions of Python did not support \NULL{} as
|
|
the value for the \var{methods} argument]{2.3}
|
|
\end{cfuncdesc}
|
|
|
|
\begin{cfuncdesc}{PyObject*}{Py_InitModule4}{char *name,
|
|
PyMethodDef *methods,
|
|
char *doc, PyObject *self,
|
|
int apiver}
|
|
Create a new module object based on a name and table of functions,
|
|
returning the new module object. If \var{doc} is non-\NULL, it will
|
|
be used to define the docstring for the module. If \var{self} is
|
|
non-\NULL, it will passed to the functions of the module as their
|
|
(otherwise \NULL) first parameter. (This was added as an
|
|
experimental feature, and there are no known uses in the current
|
|
version of Python.) For \var{apiver}, the only value which should
|
|
be passed is defined by the constant \constant{PYTHON_API_VERSION}.
|
|
|
|
\note{Most uses of this function should probably be using
|
|
the \cfunction{Py_InitModule3()} instead; only use this if you are
|
|
sure you need it.}
|
|
|
|
\versionchanged[Older versions of Python did not support \NULL{} as
|
|
the value for the \var{methods} argument]{2.3}
|
|
\end{cfuncdesc}
|
|
|
|
\begin{cvardesc}{PyObject}{_Py_NoneStruct}
|
|
Object which is visible in Python as \code{None}. This should only
|
|
be accessed using the \code{Py_None} macro, which evaluates to a
|
|
pointer to this object.
|
|
\end{cvardesc}
|
|
|
|
|
|
\section{Common Object Structures \label{common-structs}}
|
|
|
|
There are a large number of structures which are used in the
|
|
definition of object types for Python. This section describes these
|
|
structures and how they are used.
|
|
|
|
All Python objects ultimately share a small number of fields at the
|
|
beginning of the object's representation in memory. These are
|
|
represented by the \ctype{PyObject} and \ctype{PyVarObject} types,
|
|
which are defined, in turn, by the expansions of some macros also
|
|
used, whether directly or indirectly, in the definition of all other
|
|
Python objects.
|
|
|
|
\begin{ctypedesc}{PyObject}
|
|
All object types are extensions of this type. This is a type which
|
|
contains the information Python needs to treat a pointer to an
|
|
object as an object. In a normal ``release'' build, it contains
|
|
only the objects reference count and a pointer to the corresponding
|
|
type object. It corresponds to the fields defined by the
|
|
expansion of the \code{PyObject_HEAD} macro.
|
|
\end{ctypedesc}
|
|
|
|
\begin{ctypedesc}{PyVarObject}
|
|
This is an extension of \ctype{PyObject} that adds the
|
|
\member{ob_size} field. This is only used for objects that have
|
|
some notion of \emph{length}. This type does not often appear in
|
|
the Python/C API. It corresponds to the fields defined by the
|
|
expansion of the \code{PyObject_VAR_HEAD} macro.
|
|
\end{ctypedesc}
|
|
|
|
These macros are used in the definition of \ctype{PyObject} and
|
|
\ctype{PyVarObject}:
|
|
|
|
\begin{csimplemacrodesc}{PyObject_HEAD}
|
|
This is a macro which expands to the declarations of the fields of
|
|
the \ctype{PyObject} type; it is used when declaring new types which
|
|
represent objects without a varying length. The specific fields it
|
|
expands to depend on the definition of
|
|
\csimplemacro{Py_TRACE_REFS}. By default, that macro is not
|
|
defined, and \csimplemacro{PyObject_HEAD} expands to:
|
|
\begin{verbatim}
|
|
Py_ssize_t ob_refcnt;
|
|
PyTypeObject *ob_type;
|
|
\end{verbatim}
|
|
When \csimplemacro{Py_TRACE_REFS} is defined, it expands to:
|
|
\begin{verbatim}
|
|
PyObject *_ob_next, *_ob_prev;
|
|
Py_ssize_t ob_refcnt;
|
|
PyTypeObject *ob_type;
|
|
\end{verbatim}
|
|
\end{csimplemacrodesc}
|
|
|
|
\begin{csimplemacrodesc}{PyObject_VAR_HEAD}
|
|
This is a macro which expands to the declarations of the fields of
|
|
the \ctype{PyVarObject} type; it is used when declaring new types which
|
|
represent objects with a length that varies from instance to
|
|
instance. This macro always expands to:
|
|
\begin{verbatim}
|
|
PyObject_HEAD
|
|
Py_ssize_t ob_size;
|
|
\end{verbatim}
|
|
Note that \csimplemacro{PyObject_HEAD} is part of the expansion, and
|
|
that its own expansion varies depending on the definition of
|
|
\csimplemacro{Py_TRACE_REFS}.
|
|
\end{csimplemacrodesc}
|
|
|
|
PyObject_HEAD_INIT
|
|
|
|
\begin{ctypedesc}{PyCFunction}
|
|
Type of the functions used to implement most Python callables in C.
|
|
Functions of this type take two \ctype{PyObject*} parameters and
|
|
return one such value. If the return value is \NULL, an exception
|
|
shall have been set. If not \NULL, the return value is interpreted
|
|
as the return value of the function as exposed in Python. The
|
|
function must return a new reference.
|
|
\end{ctypedesc}
|
|
|
|
\begin{ctypedesc}{PyMethodDef}
|
|
Structure used to describe a method of an extension type. This
|
|
structure has four fields:
|
|
|
|
\begin{tableiii}{l|l|l}{member}{Field}{C Type}{Meaning}
|
|
\lineiii{ml_name}{char *}{name of the method}
|
|
\lineiii{ml_meth}{PyCFunction}{pointer to the C implementation}
|
|
\lineiii{ml_flags}{int}{flag bits indicating how the call should be
|
|
constructed}
|
|
\lineiii{ml_doc}{char *}{points to the contents of the docstring}
|
|
\end{tableiii}
|
|
\end{ctypedesc}
|
|
|
|
The \member{ml_meth} is a C function pointer. The functions may be of
|
|
different types, but they always return \ctype{PyObject*}. If the
|
|
function is not of the \ctype{PyCFunction}, the compiler will require
|
|
a cast in the method table. Even though \ctype{PyCFunction} defines
|
|
the first parameter as \ctype{PyObject*}, it is common that the method
|
|
implementation uses a the specific C type of the \var{self} object.
|
|
|
|
The \member{ml_flags} field is a bitfield which can include the
|
|
following flags. The individual flags indicate either a calling
|
|
convention or a binding convention. Of the calling convention flags,
|
|
only \constant{METH_VARARGS} and \constant{METH_KEYWORDS} can be
|
|
combined (but note that \constant{METH_KEYWORDS} alone is equivalent
|
|
to \code{\constant{METH_VARARGS} | \constant{METH_KEYWORDS}}).
|
|
Any of the calling convention flags can be combined with a
|
|
binding flag.
|
|
|
|
\begin{datadesc}{METH_VARARGS}
|
|
This is the typical calling convention, where the methods have the
|
|
type \ctype{PyCFunction}. The function expects two
|
|
\ctype{PyObject*} values. The first one is the \var{self} object for
|
|
methods; for module functions, it has the value given to
|
|
\cfunction{Py_InitModule4()} (or \NULL{} if
|
|
\cfunction{Py_InitModule()} was used). The second parameter
|
|
(often called \var{args}) is a tuple object representing all
|
|
arguments. This parameter is typically processed using
|
|
\cfunction{PyArg_ParseTuple()} or \cfunction{PyArg_UnpackTuple}.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{METH_KEYWORDS}
|
|
Methods with these flags must be of type
|
|
\ctype{PyCFunctionWithKeywords}. The function expects three
|
|
parameters: \var{self}, \var{args}, and a dictionary of all the
|
|
keyword arguments. The flag is typically combined with
|
|
\constant{METH_VARARGS}, and the parameters are typically processed
|
|
using \cfunction{PyArg_ParseTupleAndKeywords()}.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{METH_NOARGS}
|
|
Methods without parameters don't need to check whether arguments are
|
|
given if they are listed with the \constant{METH_NOARGS} flag. They
|
|
need to be of type \ctype{PyCFunction}. When used with object
|
|
methods, the first parameter is typically named \code{self} and will
|
|
hold a reference to the object instance. In all cases the second
|
|
parameter will be \NULL.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{METH_O}
|
|
Methods with a single object argument can be listed with the
|
|
\constant{METH_O} flag, instead of invoking
|
|
\cfunction{PyArg_ParseTuple()} with a \code{"O"} argument. They have
|
|
the type \ctype{PyCFunction}, with the \var{self} parameter, and a
|
|
\ctype{PyObject*} parameter representing the single argument.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{METH_OLDARGS}
|
|
This calling convention is deprecated. The method must be of type
|
|
\ctype{PyCFunction}. The second argument is \NULL{} if no arguments
|
|
are given, a single object if exactly one argument is given, and a
|
|
tuple of objects if more than one argument is given. There is no
|
|
way for a function using this convention to distinguish between a
|
|
call with multiple arguments and a call with a tuple as the only
|
|
argument.
|
|
\end{datadesc}
|
|
|
|
These two constants are not used to indicate the calling convention
|
|
but the binding when use with methods of classes. These may not be
|
|
used for functions defined for modules. At most one of these flags
|
|
may be set for any given method.
|
|
|
|
\begin{datadesc}{METH_CLASS}
|
|
The method will be passed the type object as the first parameter
|
|
rather than an instance of the type. This is used to create
|
|
\emph{class methods}, similar to what is created when using the
|
|
\function{classmethod()}\bifuncindex{classmethod} built-in
|
|
function.
|
|
\versionadded{2.3}
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{METH_STATIC}
|
|
The method will be passed \NULL{} as the first parameter rather than
|
|
an instance of the type. This is used to create \emph{static
|
|
methods}, similar to what is created when using the
|
|
\function{staticmethod()}\bifuncindex{staticmethod} built-in
|
|
function.
|
|
\versionadded{2.3}
|
|
\end{datadesc}
|
|
|
|
One other constant controls whether a method is loaded in place of
|
|
another definition with the same method name.
|
|
|
|
\begin{datadesc}{METH_COEXIST}
|
|
The method will be loaded in place of existing definitions. Without
|
|
\var{METH_COEXIST}, the default is to skip repeated definitions. Since
|
|
slot wrappers are loaded before the method table, the existence of a
|
|
\var{sq_contains} slot, for example, would generate a wrapped method
|
|
named \method{__contains__()} and preclude the loading of a
|
|
corresponding PyCFunction with the same name. With the flag defined,
|
|
the PyCFunction will be loaded in place of the wrapper object and will
|
|
co-exist with the slot. This is helpful because calls to PyCFunctions
|
|
are optimized more than wrapper object calls.
|
|
\versionadded{2.4}
|
|
\end{datadesc}
|
|
|
|
\begin{cfuncdesc}{PyObject*}{Py_FindMethod}{PyMethodDef table[],
|
|
PyObject *ob, char *name}
|
|
Return a bound method object for an extension type implemented in
|
|
C. This can be useful in the implementation of a
|
|
\member{tp_getattro} or \member{tp_getattr} handler that does not
|
|
use the \cfunction{PyObject_GenericGetAttr()} function.
|
|
\end{cfuncdesc}
|
|
|
|
|
|
\section{Type Objects \label{type-structs}}
|
|
|
|
Perhaps one of the most important structures of the Python object
|
|
system is the structure that defines a new type: the
|
|
\ctype{PyTypeObject} structure. Type objects can be handled using any
|
|
of the \cfunction{PyObject_*()} or \cfunction{PyType_*()} functions,
|
|
but do not offer much that's interesting to most Python applications.
|
|
These objects are fundamental to how objects behave, so they are very
|
|
important to the interpreter itself and to any extension module that
|
|
implements new types.
|
|
|
|
Type objects are fairly large compared to most of the standard types.
|
|
The reason for the size is that each type object stores a large number
|
|
of values, mostly C function pointers, each of which implements a
|
|
small part of the type's functionality. The fields of the type object
|
|
are examined in detail in this section. The fields will be described
|
|
in the order in which they occur in the structure.
|
|
|
|
Typedefs:
|
|
unaryfunc, binaryfunc, ternaryfunc, inquiry, coercion, intargfunc,
|
|
intintargfunc, intobjargproc, intintobjargproc, objobjargproc,
|
|
destructor, freefunc, printfunc, getattrfunc, getattrofunc, setattrfunc,
|
|
setattrofunc, cmpfunc, reprfunc, hashfunc
|
|
|
|
The structure definition for \ctype{PyTypeObject} can be found in
|
|
\file{Include/object.h}. For convenience of reference, this repeats
|
|
the definition found there:
|
|
|
|
\verbatiminput{typestruct.h}
|
|
|
|
The type object structure extends the \ctype{PyVarObject} structure.
|
|
The \member{ob_size} field is used for dynamic types (created
|
|
by \function{type_new()}, usually called from a class statement).
|
|
Note that \cdata{PyType_Type} (the metatype) initializes
|
|
\member{tp_itemsize}, which means that its instances (i.e. type
|
|
objects) \emph{must} have the \member{ob_size} field.
|
|
|
|
\begin{cmemberdesc}{PyObject}{PyObject*}{_ob_next}
|
|
\cmemberline{PyObject}{PyObject*}{_ob_prev}
|
|
These fields are only present when the macro \code{Py_TRACE_REFS} is
|
|
defined. Their initialization to \NULL{} is taken care of by the
|
|
\code{PyObject_HEAD_INIT} macro. For statically allocated objects,
|
|
these fields always remain \NULL. For dynamically allocated
|
|
objects, these two fields are used to link the object into a
|
|
doubly-linked list of \emph{all} live objects on the heap. This
|
|
could be used for various debugging purposes; currently the only use
|
|
is to print the objects that are still alive at the end of a run
|
|
when the environment variable \envvar{PYTHONDUMPREFS} is set.
|
|
|
|
These fields are not inherited by subtypes.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyObject}{Py_ssize_t}{ob_refcnt}
|
|
This is the type object's reference count, initialized to \code{1}
|
|
by the \code{PyObject_HEAD_INIT} macro. Note that for statically
|
|
allocated type objects, the type's instances (objects whose
|
|
\member{ob_type} points back to the type) do \emph{not} count as
|
|
references. But for dynamically allocated type objects, the
|
|
instances \emph{do} count as references.
|
|
|
|
This field is not inherited by subtypes.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyObject}{PyTypeObject*}{ob_type}
|
|
This is the type's type, in other words its metatype. It is
|
|
initialized by the argument to the \code{PyObject_HEAD_INIT} macro,
|
|
and its value should normally be \code{\&PyType_Type}. However, for
|
|
dynamically loadable extension modules that must be usable on
|
|
Windows (at least), the compiler complains that this is not a valid
|
|
initializer. Therefore, the convention is to pass \NULL{} to the
|
|
\code{PyObject_HEAD_INIT} macro and to initialize this field
|
|
explicitly at the start of the module's initialization function,
|
|
before doing anything else. This is typically done like this:
|
|
|
|
\begin{verbatim}
|
|
Foo_Type.ob_type = &PyType_Type;
|
|
\end{verbatim}
|
|
|
|
This should be done before any instances of the type are created.
|
|
\cfunction{PyType_Ready()} checks if \member{ob_type} is \NULL, and
|
|
if so, initializes it: in Python 2.2, it is set to
|
|
\code{\&PyType_Type}; in Python 2.2.1 and later it is
|
|
initialized to the \member{ob_type} field of the base class.
|
|
\cfunction{PyType_Ready()} will not change this field if it is
|
|
non-zero.
|
|
|
|
In Python 2.2, this field is not inherited by subtypes. In 2.2.1,
|
|
and in 2.3 and beyond, it is inherited by subtypes.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyVarObject}{Py_ssize_t}{ob_size}
|
|
For statically allocated type objects, this should be initialized
|
|
to zero. For dynamically allocated type objects, this field has a
|
|
special internal meaning.
|
|
|
|
This field is not inherited by subtypes.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{char*}{tp_name}
|
|
Pointer to a NUL-terminated string containing the name of the type.
|
|
For types that are accessible as module globals, the string should
|
|
be the full module name, followed by a dot, followed by the type
|
|
name; for built-in types, it should be just the type name. If the
|
|
module is a submodule of a package, the full package name is part of
|
|
the full module name. For example, a type named \class{T} defined
|
|
in module \module{M} in subpackage \module{Q} in package \module{P}
|
|
should have the \member{tp_name} initializer \code{"P.Q.M.T"}.
|
|
|
|
For dynamically allocated type objects, this should just be the type
|
|
name, and the module name explicitly stored in the type dict as the
|
|
value for key \code{'__module__'}.
|
|
|
|
For statically allocated type objects, the tp_name field should
|
|
contain a dot. Everything before the last dot is made accessible as
|
|
the \member{__module__} attribute, and everything after the last dot
|
|
is made accessible as the \member{__name__} attribute.
|
|
|
|
If no dot is present, the entire \member{tp_name} field is made
|
|
accessible as the \member{__name__} attribute, and the
|
|
\member{__module__} attribute is undefined (unless explicitly set in
|
|
the dictionary, as explained above). This means your type will be
|
|
impossible to pickle.
|
|
|
|
This field is not inherited by subtypes.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{Py_ssize_t}{tp_basicsize}
|
|
\cmemberline{PyTypeObject}{Py_ssize_t}{tp_itemsize}
|
|
These fields allow calculating the size in bytes of instances of
|
|
the type.
|
|
|
|
There are two kinds of types: types with fixed-length instances have
|
|
a zero \member{tp_itemsize} field, types with variable-length
|
|
instances have a non-zero \member{tp_itemsize} field. For a type
|
|
with fixed-length instances, all instances have the same size,
|
|
given in \member{tp_basicsize}.
|
|
|
|
For a type with variable-length instances, the instances must have
|
|
an \member{ob_size} field, and the instance size is
|
|
\member{tp_basicsize} plus N times \member{tp_itemsize}, where N is
|
|
the ``length'' of the object. The value of N is typically stored in
|
|
the instance's \member{ob_size} field. There are exceptions: for
|
|
example, long ints use a negative \member{ob_size} to indicate a
|
|
negative number, and N is \code{abs(\member{ob_size})} there. Also,
|
|
the presence of an \member{ob_size} field in the instance layout
|
|
doesn't mean that the instance structure is variable-length (for
|
|
example, the structure for the list type has fixed-length instances,
|
|
yet those instances have a meaningful \member{ob_size} field).
|
|
|
|
The basic size includes the fields in the instance declared by the
|
|
macro \csimplemacro{PyObject_HEAD} or
|
|
\csimplemacro{PyObject_VAR_HEAD} (whichever is used to declare the
|
|
instance struct) and this in turn includes the \member{_ob_prev} and
|
|
\member{_ob_next} fields if they are present. This means that the
|
|
only correct way to get an initializer for the \member{tp_basicsize}
|
|
is to use the \keyword{sizeof} operator on the struct used to
|
|
declare the instance layout. The basic size does not include the GC
|
|
header size (this is new in Python 2.2; in 2.1 and 2.0, the GC
|
|
header size was included in \member{tp_basicsize}).
|
|
|
|
These fields are inherited separately by subtypes. If the base type
|
|
has a non-zero \member{tp_itemsize}, it is generally not safe to set
|
|
\member{tp_itemsize} to a different non-zero value in a subtype
|
|
(though this depends on the implementation of the base type).
|
|
|
|
A note about alignment: if the variable items require a particular
|
|
alignment, this should be taken care of by the value of
|
|
\member{tp_basicsize}. Example: suppose a type implements an array
|
|
of \code{double}. \member{tp_itemsize} is \code{sizeof(double)}.
|
|
It is the programmer's responsibility that \member{tp_basicsize} is
|
|
a multiple of \code{sizeof(double)} (assuming this is the alignment
|
|
requirement for \code{double}).
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{destructor}{tp_dealloc}
|
|
A pointer to the instance destructor function. This function must
|
|
be defined unless the type guarantees that its instances will never
|
|
be deallocated (as is the case for the singletons \code{None} and
|
|
\code{Ellipsis}).
|
|
|
|
The destructor function is called by the \cfunction{Py_DECREF()} and
|
|
\cfunction{Py_XDECREF()} macros when the new reference count is
|
|
zero. At this point, the instance is still in existence, but there
|
|
are no references to it. The destructor function should free all
|
|
references which the instance owns, free all memory buffers owned by
|
|
the instance (using the freeing function corresponding to the
|
|
allocation function used to allocate the buffer), and finally (as
|
|
its last action) call the type's \member{tp_free} function. If the
|
|
type is not subtypable (doesn't have the
|
|
\constant{Py_TPFLAGS_BASETYPE} flag bit set), it is permissible to
|
|
call the object deallocator directly instead of via
|
|
\member{tp_free}. The object deallocator should be the one used to
|
|
allocate the instance; this is normally \cfunction{PyObject_Del()}
|
|
if the instance was allocated using \cfunction{PyObject_New()} or
|
|
\cfunction{PyObject_VarNew()}, or \cfunction{PyObject_GC_Del()} if
|
|
the instance was allocated using \cfunction{PyObject_GC_New()} or
|
|
\cfunction{PyObject_GC_VarNew()}.
|
|
|
|
This field is inherited by subtypes.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{printfunc}{tp_print}
|
|
An optional pointer to the instance print function.
|
|
|
|
The print function is only called when the instance is printed to a
|
|
\emph{real} file; when it is printed to a pseudo-file (like a
|
|
\class{StringIO} instance), the instance's \member{tp_repr} or
|
|
\member{tp_str} function is called to convert it to a string. These
|
|
are also called when the type's \member{tp_print} field is \NULL. A
|
|
type should never implement \member{tp_print} in a way that produces
|
|
different output than \member{tp_repr} or \member{tp_str} would.
|
|
|
|
The print function is called with the same signature as
|
|
\cfunction{PyObject_Print()}: \code{int tp_print(PyObject *self, FILE
|
|
*file, int flags)}. The \var{self} argument is the instance to be
|
|
printed. The \var{file} argument is the stdio file to which it is
|
|
to be printed. The \var{flags} argument is composed of flag bits.
|
|
The only flag bit currently defined is \constant{Py_PRINT_RAW}.
|
|
When the \constant{Py_PRINT_RAW} flag bit is set, the instance
|
|
should be printed the same way as \member{tp_str} would format it;
|
|
when the \constant{Py_PRINT_RAW} flag bit is clear, the instance
|
|
should be printed the same was as \member{tp_repr} would format it.
|
|
It should return \code{-1} and set an exception condition when an
|
|
error occurred during the comparison.
|
|
|
|
It is possible that the \member{tp_print} field will be deprecated.
|
|
In any case, it is recommended not to define \member{tp_print}, but
|
|
instead to rely on \member{tp_repr} and \member{tp_str} for
|
|
printing.
|
|
|
|
This field is inherited by subtypes.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{getattrfunc}{tp_getattr}
|
|
An optional pointer to the get-attribute-string function.
|
|
|
|
This field is deprecated. When it is defined, it should point to a
|
|
function that acts the same as the \member{tp_getattro} function,
|
|
but taking a C string instead of a Python string object to give the
|
|
attribute name. The signature is the same as for
|
|
\cfunction{PyObject_GetAttrString()}.
|
|
|
|
This field is inherited by subtypes together with
|
|
\member{tp_getattro}: a subtype inherits both \member{tp_getattr}
|
|
and \member{tp_getattro} from its base type when the subtype's
|
|
\member{tp_getattr} and \member{tp_getattro} are both \NULL.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{setattrfunc}{tp_setattr}
|
|
An optional pointer to the set-attribute-string function.
|
|
|
|
This field is deprecated. When it is defined, it should point to a
|
|
function that acts the same as the \member{tp_setattro} function,
|
|
but taking a C string instead of a Python string object to give the
|
|
attribute name. The signature is the same as for
|
|
\cfunction{PyObject_SetAttrString()}.
|
|
|
|
This field is inherited by subtypes together with
|
|
\member{tp_setattro}: a subtype inherits both \member{tp_setattr}
|
|
and \member{tp_setattro} from its base type when the subtype's
|
|
\member{tp_setattr} and \member{tp_setattro} are both \NULL.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{cmpfunc}{tp_compare}
|
|
An optional pointer to the three-way comparison function.
|
|
|
|
The signature is the same as for \cfunction{PyObject_Compare()}.
|
|
The function should return \code{1} if \var{self} greater than
|
|
\var{other}, \code{0} if \var{self} is equal to \var{other}, and
|
|
\code{-1} if \var{self} less than \var{other}. It should return
|
|
\code{-1} and set an exception condition when an error occurred
|
|
during the comparison.
|
|
|
|
This field is inherited by subtypes together with
|
|
\member{tp_richcompare} and \member{tp_hash}: a subtypes inherits
|
|
all three of \member{tp_compare}, \member{tp_richcompare}, and
|
|
\member{tp_hash} when the subtype's \member{tp_compare},
|
|
\member{tp_richcompare}, and \member{tp_hash} are all \NULL.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{reprfunc}{tp_repr}
|
|
An optional pointer to a function that implements the built-in
|
|
function \function{repr()}.\bifuncindex{repr}
|
|
|
|
The signature is the same as for \cfunction{PyObject_Repr()}; it
|
|
must return a string or a Unicode object. Ideally, this function
|
|
should return a string that, when passed to \function{eval()}, given
|
|
a suitable environment, returns an object with the same value. If
|
|
this is not feasible, it should return a string starting with
|
|
\character{\textless} and ending with \character{\textgreater} from
|
|
which both the type and the value of the object can be deduced.
|
|
|
|
When this field is not set, a string of the form \samp{<\%s object
|
|
at \%p>} is returned, where \code{\%s} is replaced by the type name,
|
|
and \code{\%p} by the object's memory address.
|
|
|
|
This field is inherited by subtypes.
|
|
\end{cmemberdesc}
|
|
|
|
PyNumberMethods *tp_as_number;
|
|
|
|
XXX
|
|
|
|
PySequenceMethods *tp_as_sequence;
|
|
|
|
XXX
|
|
|
|
PyMappingMethods *tp_as_mapping;
|
|
|
|
XXX
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{hashfunc}{tp_hash}
|
|
An optional pointer to a function that implements the built-in
|
|
function \function{hash()}.\bifuncindex{hash}
|
|
|
|
The signature is the same as for \cfunction{PyObject_Hash()}; it
|
|
must return a C long. The value \code{-1} should not be returned as
|
|
a normal return value; when an error occurs during the computation
|
|
of the hash value, the function should set an exception and return
|
|
\code{-1}.
|
|
|
|
When this field is not set, two possibilities exist: if the
|
|
\member{tp_compare} and \member{tp_richcompare} fields are both
|
|
\NULL, a default hash value based on the object's address is
|
|
returned; otherwise, a \exception{TypeError} is raised.
|
|
|
|
This field is inherited by subtypes together with
|
|
\member{tp_richcompare} and \member{tp_compare}: a subtypes inherits
|
|
all three of \member{tp_compare}, \member{tp_richcompare}, and
|
|
\member{tp_hash}, when the subtype's \member{tp_compare},
|
|
\member{tp_richcompare} and \member{tp_hash} are all \NULL.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{ternaryfunc}{tp_call}
|
|
An optional pointer to a function that implements calling the
|
|
object. This should be \NULL{} if the object is not callable. The
|
|
signature is the same as for \cfunction{PyObject_Call()}.
|
|
|
|
This field is inherited by subtypes.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{reprfunc}{tp_str}
|
|
An optional pointer to a function that implements the built-in
|
|
operation \function{str()}. (Note that \class{str} is a type now,
|
|
and \function{str()} calls the constructor for that type. This
|
|
constructor calls \cfunction{PyObject_Str()} to do the actual work,
|
|
and \cfunction{PyObject_Str()} will call this handler.)
|
|
|
|
The signature is the same as for \cfunction{PyObject_Str()}; it must
|
|
return a string or a Unicode object. This function should return a
|
|
``friendly'' string representation of the object, as this is the
|
|
representation that will be used by the print statement.
|
|
|
|
When this field is not set, \cfunction{PyObject_Repr()} is called to
|
|
return a string representation.
|
|
|
|
This field is inherited by subtypes.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{getattrofunc}{tp_getattro}
|
|
An optional pointer to the get-attribute function.
|
|
|
|
The signature is the same as for \cfunction{PyObject_GetAttr()}. It
|
|
is usually convenient to set this field to
|
|
\cfunction{PyObject_GenericGetAttr()}, which implements the normal
|
|
way of looking for object attributes.
|
|
|
|
This field is inherited by subtypes together with
|
|
\member{tp_getattr}: a subtype inherits both \member{tp_getattr} and
|
|
\member{tp_getattro} from its base type when the subtype's
|
|
\member{tp_getattr} and \member{tp_getattro} are both \NULL.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{setattrofunc}{tp_setattro}
|
|
An optional pointer to the set-attribute function.
|
|
|
|
The signature is the same as for \cfunction{PyObject_SetAttr()}. It
|
|
is usually convenient to set this field to
|
|
\cfunction{PyObject_GenericSetAttr()}, which implements the normal
|
|
way of setting object attributes.
|
|
|
|
This field is inherited by subtypes together with
|
|
\member{tp_setattr}: a subtype inherits both \member{tp_setattr} and
|
|
\member{tp_setattro} from its base type when the subtype's
|
|
\member{tp_setattr} and \member{tp_setattro} are both \NULL.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{PyBufferProcs*}{tp_as_buffer}
|
|
Pointer to an additional structure that contains fields relevant only to
|
|
objects which implement the buffer interface. These fields are
|
|
documented in ``Buffer Object Structures'' (section
|
|
\ref{buffer-structs}).
|
|
|
|
The \member{tp_as_buffer} field is not inherited, but the contained
|
|
fields are inherited individually.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{long}{tp_flags}
|
|
This field is a bit mask of various flags. Some flags indicate
|
|
variant semantics for certain situations; others are used to
|
|
indicate that certain fields in the type object (or in the extension
|
|
structures referenced via \member{tp_as_number},
|
|
\member{tp_as_sequence}, \member{tp_as_mapping}, and
|
|
\member{tp_as_buffer}) that were historically not always present are
|
|
valid; if such a flag bit is clear, the type fields it guards must
|
|
not be accessed and must be considered to have a zero or \NULL{}
|
|
value instead.
|
|
|
|
Inheritance of this field is complicated. Most flag bits are
|
|
inherited individually, i.e. if the base type has a flag bit set,
|
|
the subtype inherits this flag bit. The flag bits that pertain to
|
|
extension structures are strictly inherited if the extension
|
|
structure is inherited, i.e. the base type's value of the flag bit
|
|
is copied into the subtype together with a pointer to the extension
|
|
structure. The \constant{Py_TPFLAGS_HAVE_GC} flag bit is inherited
|
|
together with the \member{tp_traverse} and \member{tp_clear} fields,
|
|
i.e. if the \constant{Py_TPFLAGS_HAVE_GC} flag bit is clear in the
|
|
subtype and the \member{tp_traverse} and \member{tp_clear} fields in
|
|
the subtype exist (as indicated by the
|
|
\constant{Py_TPFLAGS_HAVE_RICHCOMPARE} flag bit) and have \NULL{}
|
|
values.
|
|
|
|
The following bit masks are currently defined; these can be or-ed
|
|
together using the \code{|} operator to form the value of the
|
|
\member{tp_flags} field. The macro \cfunction{PyType_HasFeature()}
|
|
takes a type and a flags value, \var{tp} and \var{f}, and checks
|
|
whether \code{\var{tp}->tp_flags \& \var{f}} is non-zero.
|
|
|
|
\begin{datadesc}{Py_TPFLAGS_HAVE_GETCHARBUFFER}
|
|
If this bit is set, the \ctype{PyBufferProcs} struct referenced by
|
|
\member{tp_as_buffer} has the \member{bf_getcharbuffer} field.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{Py_TPFLAGS_HAVE_SEQUENCE_IN}
|
|
If this bit is set, the \ctype{PySequenceMethods} struct
|
|
referenced by \member{tp_as_sequence} has the \member{sq_contains}
|
|
field.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{Py_TPFLAGS_GC}
|
|
This bit is obsolete. The bit it used to name is no longer in
|
|
use. The symbol is now defined as zero.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{Py_TPFLAGS_HAVE_INPLACEOPS}
|
|
If this bit is set, the \ctype{PySequenceMethods} struct
|
|
referenced by \member{tp_as_sequence} and the
|
|
\ctype{PyNumberMethods} structure referenced by
|
|
\member{tp_as_number} contain the fields for in-place operators.
|
|
In particular, this means that the \ctype{PyNumberMethods}
|
|
structure has the fields \member{nb_inplace_add},
|
|
\member{nb_inplace_subtract}, \member{nb_inplace_multiply},
|
|
\member{nb_inplace_divide}, \member{nb_inplace_remainder},
|
|
\member{nb_inplace_power}, \member{nb_inplace_lshift},
|
|
\member{nb_inplace_rshift}, \member{nb_inplace_and},
|
|
\member{nb_inplace_xor}, and \member{nb_inplace_or}; and the
|
|
\ctype{PySequenceMethods} struct has the fields
|
|
\member{sq_inplace_concat} and \member{sq_inplace_repeat}.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{Py_TPFLAGS_CHECKTYPES}
|
|
If this bit is set, the binary and ternary operations in the
|
|
\ctype{PyNumberMethods} structure referenced by
|
|
\member{tp_as_number} accept arguments of arbitrary object types,
|
|
and do their own type conversions if needed. If this bit is
|
|
clear, those operations require that all arguments have the
|
|
current type as their type, and the caller is supposed to perform
|
|
a coercion operation first. This applies to \member{nb_add},
|
|
\member{nb_subtract}, \member{nb_multiply}, \member{nb_divide},
|
|
\member{nb_remainder}, \member{nb_divmod}, \member{nb_power},
|
|
\member{nb_lshift}, \member{nb_rshift}, \member{nb_and},
|
|
\member{nb_xor}, and \member{nb_or}.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{Py_TPFLAGS_HAVE_RICHCOMPARE}
|
|
If this bit is set, the type object has the
|
|
\member{tp_richcompare} field, as well as the \member{tp_traverse}
|
|
and the \member{tp_clear} fields.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{Py_TPFLAGS_HAVE_WEAKREFS}
|
|
If this bit is set, the \member{tp_weaklistoffset} field is
|
|
defined. Instances of a type are weakly referenceable if the
|
|
type's \member{tp_weaklistoffset} field has a value greater than
|
|
zero.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{Py_TPFLAGS_HAVE_ITER}
|
|
If this bit is set, the type object has the \member{tp_iter} and
|
|
\member{tp_iternext} fields.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{Py_TPFLAGS_HAVE_CLASS}
|
|
If this bit is set, the type object has several new fields defined
|
|
starting in Python 2.2: \member{tp_methods}, \member{tp_members},
|
|
\member{tp_getset}, \member{tp_base}, \member{tp_dict},
|
|
\member{tp_descr_get}, \member{tp_descr_set},
|
|
\member{tp_dictoffset}, \member{tp_init}, \member{tp_alloc},
|
|
\member{tp_new}, \member{tp_free}, \member{tp_is_gc},
|
|
\member{tp_bases}, \member{tp_mro}, \member{tp_cache},
|
|
\member{tp_subclasses}, and \member{tp_weaklist}.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{Py_TPFLAGS_HEAPTYPE}
|
|
This bit is set when the type object itself is allocated on the
|
|
heap. In this case, the \member{ob_type} field of its instances
|
|
is considered a reference to the type, and the type object is
|
|
INCREF'ed when a new instance is created, and DECREF'ed when an
|
|
instance is destroyed (this does not apply to instances of
|
|
subtypes; only the type referenced by the instance's ob_type gets
|
|
INCREF'ed or DECREF'ed).
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{Py_TPFLAGS_BASETYPE}
|
|
This bit is set when the type can be used as the base type of
|
|
another type. If this bit is clear, the type cannot be subtyped
|
|
(similar to a "final" class in Java).
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{Py_TPFLAGS_READY}
|
|
This bit is set when the type object has been fully initialized by
|
|
\cfunction{PyType_Ready()}.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{Py_TPFLAGS_READYING}
|
|
This bit is set while \cfunction{PyType_Ready()} is in the process
|
|
of initializing the type object.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{Py_TPFLAGS_HAVE_GC}
|
|
This bit is set when the object supports garbage collection. If
|
|
this bit is set, instances must be created using
|
|
\cfunction{PyObject_GC_New()} and destroyed using
|
|
\cfunction{PyObject_GC_Del()}. More information in section XXX
|
|
about garbage collection. This bit also implies that the
|
|
GC-related fields \member{tp_traverse} and \member{tp_clear} are
|
|
present in the type object; but those fields also exist when
|
|
\constant{Py_TPFLAGS_HAVE_GC} is clear but
|
|
\constant{Py_TPFLAGS_HAVE_RICHCOMPARE} is set.
|
|
\end{datadesc}
|
|
|
|
\begin{datadesc}{Py_TPFLAGS_DEFAULT}
|
|
This is a bitmask of all the bits that pertain to the existence of
|
|
certain fields in the type object and its extension structures.
|
|
Currently, it includes the following bits:
|
|
\constant{Py_TPFLAGS_HAVE_GETCHARBUFFER},
|
|
\constant{Py_TPFLAGS_HAVE_SEQUENCE_IN},
|
|
\constant{Py_TPFLAGS_HAVE_INPLACEOPS},
|
|
\constant{Py_TPFLAGS_HAVE_RICHCOMPARE},
|
|
\constant{Py_TPFLAGS_HAVE_WEAKREFS},
|
|
\constant{Py_TPFLAGS_HAVE_ITER}, and
|
|
\constant{Py_TPFLAGS_HAVE_CLASS}.
|
|
\end{datadesc}
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{char*}{tp_doc}
|
|
An optional pointer to a NUL-terminated C string giving the
|
|
docstring for this type object. This is exposed as the
|
|
\member{__doc__} attribute on the type and instances of the type.
|
|
|
|
This field is \emph{not} inherited by subtypes.
|
|
\end{cmemberdesc}
|
|
|
|
The following three fields only exist if the
|
|
\constant{Py_TPFLAGS_HAVE_RICHCOMPARE} flag bit is set.
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{traverseproc}{tp_traverse}
|
|
An optional pointer to a traversal function for the garbage
|
|
collector. This is only used if the \constant{Py_TPFLAGS_HAVE_GC}
|
|
flag bit is set. More information about Python's garbage collection
|
|
scheme can be found in section \ref{supporting-cycle-detection}.
|
|
|
|
The \member{tp_traverse} pointer is used by the garbage collector
|
|
to detect reference cycles. A typical implementation of a
|
|
\member{tp_traverse} function simply calls \cfunction{Py_VISIT()} on
|
|
each of the instance's members that are Python objects. For exampe, this
|
|
is function \cfunction{local_traverse} from the \module{thread} extension
|
|
module:
|
|
|
|
\begin{verbatim}
|
|
static int
|
|
local_traverse(localobject *self, visitproc visit, void *arg)
|
|
{
|
|
Py_VISIT(self->args);
|
|
Py_VISIT(self->kw);
|
|
Py_VISIT(self->dict);
|
|
return 0;
|
|
}
|
|
\end{verbatim}
|
|
|
|
Note that \cfunction{Py_VISIT()} is called only on those members that can
|
|
participate in reference cycles. Although there is also a
|
|
\samp{self->key} member, it can only be \NULL{} or a Python string and
|
|
therefore cannot be part of a reference cycle.
|
|
|
|
On the other hand, even if you know a member can never be part of a cycle,
|
|
as a debugging aid you may want to visit it anyway just so the
|
|
\module{gc} module's \function{get_referents()} function will include it.
|
|
|
|
Note that \cfunction{Py_VISIT()} requires the \var{visit} and \var{arg}
|
|
parameters to \cfunction{local_traverse} to have these specific names;
|
|
don't name them just anything.
|
|
|
|
This field is inherited by subtypes together with \member{tp_clear}
|
|
and the \constant{Py_TPFLAGS_HAVE_GC} flag bit: the flag bit,
|
|
\member{tp_traverse}, and \member{tp_clear} are all inherited from
|
|
the base type if they are all zero in the subtype \emph{and} the
|
|
subtype has the \constant{Py_TPFLAGS_HAVE_RICHCOMPARE} flag bit set.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{inquiry}{tp_clear}
|
|
An optional pointer to a clear function for the garbage collector.
|
|
This is only used if the \constant{Py_TPFLAGS_HAVE_GC} flag bit is
|
|
set.
|
|
|
|
The \member{tp_clear} member function is used to break reference
|
|
cycles in cyclic garbage detected by the garbage collector. Taken
|
|
together, all \member{tp_clear} functions in the system must combine to
|
|
break all reference cycles. This is subtle, and if in any doubt supply a
|
|
\member{tp_clear} function. For example, the tuple type does not
|
|
implement a \member{tp_clear} function, because it's possible to prove
|
|
that no reference cycle can be composed entirely of tuples. Therefore
|
|
the \member{tp_clear} functions of other types must be sufficient to
|
|
break any cycle containing a tuple. This isn't immediately obvious, and
|
|
there's rarely a good reason to avoid implementing \member{tp_clear}.
|
|
|
|
Implementations of \member{tp_clear} should drop the instance's
|
|
references to those of its members that may be Python objects, and set
|
|
its pointers to those members to \NULL{}, as in the following example:
|
|
|
|
\begin{verbatim}
|
|
static int
|
|
local_clear(localobject *self)
|
|
{
|
|
Py_CLEAR(self->key);
|
|
Py_CLEAR(self->args);
|
|
Py_CLEAR(self->kw);
|
|
Py_CLEAR(self->dict);
|
|
return 0;
|
|
}
|
|
\end{verbatim}
|
|
|
|
The \cfunction{Py_CLEAR()} macro should be used, because clearing
|
|
references is delicate: the reference to the contained object must not be
|
|
decremented until after the pointer to the contained object is set to
|
|
\NULL{}. This is because decrementing the reference count may cause
|
|
the contained object to become trash, triggering a chain of reclamation
|
|
activity that may include invoking arbitrary Python code (due to
|
|
finalizers, or weakref callbacks, associated with the contained object).
|
|
If it's possible for such code to reference \var{self} again, it's
|
|
important that the pointer to the contained object be \NULL{} at that
|
|
time, so that \var{self} knows the contained object can no longer be
|
|
used. The \cfunction{Py_CLEAR()} macro performs the operations in a
|
|
safe order.
|
|
|
|
Because the goal of \member{tp_clear} functions is to break reference
|
|
cycles, it's not necessary to clear contained objects like Python strings
|
|
or Python integers, which can't participate in reference cycles.
|
|
On the other hand, it may be convenient to clear all contained Python
|
|
objects, and write the type's \member{tp_dealloc} function to
|
|
invoke \member{tp_clear}.
|
|
|
|
More information about Python's garbage collection
|
|
scheme can be found in section \ref{supporting-cycle-detection}.
|
|
|
|
This field is inherited by subtypes together with \member{tp_traverse}
|
|
and the \constant{Py_TPFLAGS_HAVE_GC} flag bit: the flag bit,
|
|
\member{tp_traverse}, and \member{tp_clear} are all inherited from
|
|
the base type if they are all zero in the subtype \emph{and} the
|
|
subtype has the \constant{Py_TPFLAGS_HAVE_RICHCOMPARE} flag bit set.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{richcmpfunc}{tp_richcompare}
|
|
An optional pointer to the rich comparison function.
|
|
|
|
The signature is the same as for \cfunction{PyObject_RichCompare()}.
|
|
The function should return the result of the comparison (usually
|
|
\code{Py_True} or \code{Py_False}). If the comparison is undefined,
|
|
it must return \code{Py_NotImplemented}, if another error occurred
|
|
it must return \code{NULL} and set an exception condition.
|
|
|
|
This field is inherited by subtypes together with
|
|
\member{tp_compare} and \member{tp_hash}: a subtype inherits all
|
|
three of \member{tp_compare}, \member{tp_richcompare}, and
|
|
\member{tp_hash}, when the subtype's \member{tp_compare},
|
|
\member{tp_richcompare}, and \member{tp_hash} are all \NULL.
|
|
|
|
The following constants are defined to be used as the third argument
|
|
for \member{tp_richcompare} and for \cfunction{PyObject_RichCompare()}:
|
|
|
|
\begin{tableii}{l|c}{constant}{Constant}{Comparison}
|
|
\lineii{Py_LT}{\code{<}}
|
|
\lineii{Py_LE}{\code{<=}}
|
|
\lineii{Py_EQ}{\code{==}}
|
|
\lineii{Py_NE}{\code{!=}}
|
|
\lineii{Py_GT}{\code{>}}
|
|
\lineii{Py_GE}{\code{>=}}
|
|
\end{tableii}
|
|
\end{cmemberdesc}
|
|
|
|
The next field only exists if the \constant{Py_TPFLAGS_HAVE_WEAKREFS}
|
|
flag bit is set.
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{long}{tp_weaklistoffset}
|
|
If the instances of this type are weakly referenceable, this field
|
|
is greater than zero and contains the offset in the instance
|
|
structure of the weak reference list head (ignoring the GC header,
|
|
if present); this offset is used by
|
|
\cfunction{PyObject_ClearWeakRefs()} and the
|
|
\cfunction{PyWeakref_*()} functions. The instance structure needs
|
|
to include a field of type \ctype{PyObject*} which is initialized to
|
|
\NULL.
|
|
|
|
Do not confuse this field with \member{tp_weaklist}; that is the
|
|
list head for weak references to the type object itself.
|
|
|
|
This field is inherited by subtypes, but see the rules listed below.
|
|
A subtype may override this offset; this means that the subtype uses
|
|
a different weak reference list head than the base type. Since the
|
|
list head is always found via \member{tp_weaklistoffset}, this
|
|
should not be a problem.
|
|
|
|
When a type defined by a class statement has no \member{__slots__}
|
|
declaration, and none of its base types are weakly referenceable,
|
|
the type is made weakly referenceable by adding a weak reference
|
|
list head slot to the instance layout and setting the
|
|
\member{tp_weaklistoffset} of that slot's offset.
|
|
|
|
When a type's \member{__slots__} declaration contains a slot named
|
|
\member{__weakref__}, that slot becomes the weak reference list head
|
|
for instances of the type, and the slot's offset is stored in the
|
|
type's \member{tp_weaklistoffset}.
|
|
|
|
When a type's \member{__slots__} declaration does not contain a slot
|
|
named \member{__weakref__}, the type inherits its
|
|
\member{tp_weaklistoffset} from its base type.
|
|
\end{cmemberdesc}
|
|
|
|
The next two fields only exist if the
|
|
\constant{Py_TPFLAGS_HAVE_CLASS} flag bit is set.
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{getiterfunc}{tp_iter}
|
|
An optional pointer to a function that returns an iterator for the
|
|
object. Its presence normally signals that the instances of this
|
|
type are iterable (although sequences may be iterable without this
|
|
function, and classic instances always have this function, even if
|
|
they don't define an \method{__iter__()} method).
|
|
|
|
This function has the same signature as
|
|
\cfunction{PyObject_GetIter()}.
|
|
|
|
This field is inherited by subtypes.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{iternextfunc}{tp_iternext}
|
|
An optional pointer to a function that returns the next item in an
|
|
iterator, or raises \exception{StopIteration} when the iterator is
|
|
exhausted. Its presence normally signals that the instances of this
|
|
type are iterators (although classic instances always have this
|
|
function, even if they don't define a \method{next()} method).
|
|
|
|
Iterator types should also define the \member{tp_iter} function, and
|
|
that function should return the iterator instance itself (not a new
|
|
iterator instance).
|
|
|
|
This function has the same signature as \cfunction{PyIter_Next()}.
|
|
|
|
This field is inherited by subtypes.
|
|
\end{cmemberdesc}
|
|
|
|
The next fields, up to and including \member{tp_weaklist}, only exist
|
|
if the \constant{Py_TPFLAGS_HAVE_CLASS} flag bit is set.
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{struct PyMethodDef*}{tp_methods}
|
|
An optional pointer to a static \NULL-terminated array of
|
|
\ctype{PyMethodDef} structures, declaring regular methods of this
|
|
type.
|
|
|
|
For each entry in the array, an entry is added to the type's
|
|
dictionary (see \member{tp_dict} below) containing a method
|
|
descriptor.
|
|
|
|
This field is not inherited by subtypes (methods are
|
|
inherited through a different mechanism).
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{struct PyMemberDef*}{tp_members}
|
|
An optional pointer to a static \NULL-terminated array of
|
|
\ctype{PyMemberDef} structures, declaring regular data members
|
|
(fields or slots) of instances of this type.
|
|
|
|
For each entry in the array, an entry is added to the type's
|
|
dictionary (see \member{tp_dict} below) containing a member
|
|
descriptor.
|
|
|
|
This field is not inherited by subtypes (members are inherited
|
|
through a different mechanism).
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{struct PyGetSetDef*}{tp_getset}
|
|
An optional pointer to a static \NULL-terminated array of
|
|
\ctype{PyGetSetDef} structures, declaring computed attributes of
|
|
instances of this type.
|
|
|
|
For each entry in the array, an entry is added to the type's
|
|
dictionary (see \member{tp_dict} below) containing a getset
|
|
descriptor.
|
|
|
|
This field is not inherited by subtypes (computed attributes are
|
|
inherited through a different mechanism).
|
|
|
|
Docs for PyGetSetDef (XXX belong elsewhere):
|
|
|
|
\begin{verbatim}
|
|
typedef PyObject *(*getter)(PyObject *, void *);
|
|
typedef int (*setter)(PyObject *, PyObject *, void *);
|
|
|
|
typedef struct PyGetSetDef {
|
|
char *name; /* attribute name */
|
|
getter get; /* C function to get the attribute */
|
|
setter set; /* C function to set the attribute */
|
|
char *doc; /* optional doc string */
|
|
void *closure; /* optional additional data for getter and setter */
|
|
} PyGetSetDef;
|
|
\end{verbatim}
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{PyTypeObject*}{tp_base}
|
|
An optional pointer to a base type from which type properties are
|
|
inherited. At this level, only single inheritance is supported;
|
|
multiple inheritance require dynamically creating a type object by
|
|
calling the metatype.
|
|
|
|
This field is not inherited by subtypes (obviously), but it defaults
|
|
to \code{\&PyBaseObject_Type} (which to Python programmers is known
|
|
as the type \class{object}).
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{PyObject*}{tp_dict}
|
|
The type's dictionary is stored here by \cfunction{PyType_Ready()}.
|
|
|
|
This field should normally be initialized to \NULL{} before
|
|
PyType_Ready is called; it may also be initialized to a dictionary
|
|
containing initial attributes for the type. Once
|
|
\cfunction{PyType_Ready()} has initialized the type, extra
|
|
attributes for the type may be added to this dictionary only if they
|
|
don't correspond to overloaded operations (like \method{__add__()}).
|
|
|
|
This field is not inherited by subtypes (though the attributes
|
|
defined in here are inherited through a different mechanism).
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{descrgetfunc}{tp_descr_get}
|
|
An optional pointer to a "descriptor get" function.
|
|
|
|
|
|
The function signature is
|
|
|
|
\begin{verbatim}
|
|
PyObject * tp_descr_get(PyObject *self, PyObject *obj, PyObject *type);
|
|
\end{verbatim}
|
|
|
|
XXX blah, blah.
|
|
|
|
This field is inherited by subtypes.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{descrsetfunc}{tp_descr_set}
|
|
An optional pointer to a "descriptor set" function.
|
|
|
|
The function signature is
|
|
|
|
\begin{verbatim}
|
|
int tp_descr_set(PyObject *self, PyObject *obj, PyObject *value);
|
|
\end{verbatim}
|
|
|
|
This field is inherited by subtypes.
|
|
|
|
XXX blah, blah.
|
|
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{long}{tp_dictoffset}
|
|
If the instances of this type have a dictionary containing instance
|
|
variables, this field is non-zero and contains the offset in the
|
|
instances of the type of the instance variable dictionary; this
|
|
offset is used by \cfunction{PyObject_GenericGetAttr()}.
|
|
|
|
Do not confuse this field with \member{tp_dict}; that is the
|
|
dictionary for attributes of the type object itself.
|
|
|
|
If the value of this field is greater than zero, it specifies the
|
|
offset from the start of the instance structure. If the value is
|
|
less than zero, it specifies the offset from the \emph{end} of the
|
|
instance structure. A negative offset is more expensive to use, and
|
|
should only be used when the instance structure contains a
|
|
variable-length part. This is used for example to add an instance
|
|
variable dictionary to subtypes of \class{str} or \class{tuple}.
|
|
Note that the \member{tp_basicsize} field should account for the
|
|
dictionary added to the end in that case, even though the dictionary
|
|
is not included in the basic object layout. On a system with a
|
|
pointer size of 4 bytes, \member{tp_dictoffset} should be set to
|
|
\code{-4} to indicate that the dictionary is at the very end of the
|
|
structure.
|
|
|
|
The real dictionary offset in an instance can be computed from a
|
|
negative \member{tp_dictoffset} as follows:
|
|
|
|
\begin{verbatim}
|
|
dictoffset = tp_basicsize + abs(ob_size)*tp_itemsize + tp_dictoffset
|
|
if dictoffset is not aligned on sizeof(void*):
|
|
round up to sizeof(void*)
|
|
\end{verbatim}
|
|
|
|
where \member{tp_basicsize}, \member{tp_itemsize} and
|
|
\member{tp_dictoffset} are taken from the type object, and
|
|
\member{ob_size} is taken from the instance. The absolute value is
|
|
taken because long ints use the sign of \member{ob_size} to store
|
|
the sign of the number. (There's never a need to do this
|
|
calculation yourself; it is done for you by
|
|
\cfunction{_PyObject_GetDictPtr()}.)
|
|
|
|
This field is inherited by subtypes, but see the rules listed below.
|
|
A subtype may override this offset; this means that the subtype
|
|
instances store the dictionary at a difference offset than the base
|
|
type. Since the dictionary is always found via
|
|
\member{tp_dictoffset}, this should not be a problem.
|
|
|
|
When a type defined by a class statement has no \member{__slots__}
|
|
declaration, and none of its base types has an instance variable
|
|
dictionary, a dictionary slot is added to the instance layout and
|
|
the \member{tp_dictoffset} is set to that slot's offset.
|
|
|
|
When a type defined by a class statement has a \member{__slots__}
|
|
declaration, the type inherits its \member{tp_dictoffset} from its
|
|
base type.
|
|
|
|
(Adding a slot named \member{__dict__} to the \member{__slots__}
|
|
declaration does not have the expected effect, it just causes
|
|
confusion. Maybe this should be added as a feature just like
|
|
\member{__weakref__} though.)
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{initproc}{tp_init}
|
|
An optional pointer to an instance initialization function.
|
|
|
|
This function corresponds to the \method{__init__()} method of
|
|
classes. Like \method{__init__()}, it is possible to create an
|
|
instance without calling \method{__init__()}, and it is possible to
|
|
reinitialize an instance by calling its \method{__init__()} method
|
|
again.
|
|
|
|
The function signature is
|
|
|
|
\begin{verbatim}
|
|
int tp_init(PyObject *self, PyObject *args, PyObject *kwds)
|
|
\end{verbatim}
|
|
|
|
The self argument is the instance to be initialized; the \var{args}
|
|
and \var{kwds} arguments represent positional and keyword arguments
|
|
of the call to \method{__init__()}.
|
|
|
|
The \member{tp_init} function, if not \NULL, is called when an
|
|
instance is created normally by calling its type, after the type's
|
|
\member{tp_new} function has returned an instance of the type. If
|
|
the \member{tp_new} function returns an instance of some other type
|
|
that is not a subtype of the original type, no \member{tp_init}
|
|
function is called; if \member{tp_new} returns an instance of a
|
|
subtype of the original type, the subtype's \member{tp_init} is
|
|
called. (VERSION NOTE: described here is what is implemented in
|
|
Python 2.2.1 and later. In Python 2.2, the \member{tp_init} of the
|
|
type of the object returned by \member{tp_new} was always called, if
|
|
not \NULL.)
|
|
|
|
This field is inherited by subtypes.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{allocfunc}{tp_alloc}
|
|
An optional pointer to an instance allocation function.
|
|
|
|
The function signature is
|
|
|
|
\begin{verbatim}
|
|
PyObject *tp_alloc(PyTypeObject *self, Py_ssize_t nitems)
|
|
\end{verbatim}
|
|
|
|
The purpose of this function is to separate memory allocation from
|
|
memory initialization. It should return a pointer to a block of
|
|
memory of adequate length for the instance, suitably aligned, and
|
|
initialized to zeros, but with \member{ob_refcnt} set to \code{1}
|
|
and \member{ob_type} set to the type argument. If the type's
|
|
\member{tp_itemsize} is non-zero, the object's \member{ob_size} field
|
|
should be initialized to \var{nitems} and the length of the
|
|
allocated memory block should be \code{tp_basicsize +
|
|
\var{nitems}*tp_itemsize}, rounded up to a multiple of
|
|
\code{sizeof(void*)}; otherwise, \var{nitems} is not used and the
|
|
length of the block should be \member{tp_basicsize}.
|
|
|
|
Do not use this function to do any other instance initialization,
|
|
not even to allocate additional memory; that should be done by
|
|
\member{tp_new}.
|
|
|
|
This field is inherited by static subtypes, but not by dynamic
|
|
subtypes (subtypes created by a class statement); in the latter,
|
|
this field is always set to \cfunction{PyType_GenericAlloc}, to
|
|
force a standard heap allocation strategy. That is also the
|
|
recommended value for statically defined types.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{newfunc}{tp_new}
|
|
An optional pointer to an instance creation function.
|
|
|
|
If this function is \NULL{} for a particular type, that type cannot
|
|
be called to create new instances; presumably there is some other
|
|
way to create instances, like a factory function.
|
|
|
|
The function signature is
|
|
|
|
\begin{verbatim}
|
|
PyObject *tp_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
|
|
\end{verbatim}
|
|
|
|
The subtype argument is the type of the object being created; the
|
|
\var{args} and \var{kwds} arguments represent positional and keyword
|
|
arguments of the call to the type. Note that subtype doesn't have
|
|
to equal the type whose \member{tp_new} function is called; it may
|
|
be a subtype of that type (but not an unrelated type).
|
|
|
|
The \member{tp_new} function should call
|
|
\code{\var{subtype}->tp_alloc(\var{subtype}, \var{nitems})} to
|
|
allocate space for the object, and then do only as much further
|
|
initialization as is absolutely necessary. Initialization that can
|
|
safely be ignored or repeated should be placed in the
|
|
\member{tp_init} handler. A good rule of thumb is that for
|
|
immutable types, all initialization should take place in
|
|
\member{tp_new}, while for mutable types, most initialization should
|
|
be deferred to \member{tp_init}.
|
|
|
|
This field is inherited by subtypes, except it is not inherited by
|
|
static types whose \member{tp_base} is \NULL{} or
|
|
\code{\&PyBaseObject_Type}. The latter exception is a precaution so
|
|
that old extension types don't become callable simply by being
|
|
linked with Python 2.2.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{destructor}{tp_free}
|
|
An optional pointer to an instance deallocation function.
|
|
|
|
The signature of this function has changed slightly: in Python
|
|
2.2 and 2.2.1, its signature is \ctype{destructor}:
|
|
|
|
\begin{verbatim}
|
|
void tp_free(PyObject *)
|
|
\end{verbatim}
|
|
|
|
In Python 2.3 and beyond, its signature is \ctype{freefunc}:
|
|
|
|
\begin{verbatim}
|
|
void tp_free(void *)
|
|
\end{verbatim}
|
|
|
|
The only initializer that is compatible with both versions is
|
|
\code{_PyObject_Del}, whose definition has suitably adapted in
|
|
Python 2.3.
|
|
|
|
This field is inherited by static subtypes, but not by dynamic
|
|
subtypes (subtypes created by a class statement); in the latter,
|
|
this field is set to a deallocator suitable to match
|
|
\cfunction{PyType_GenericAlloc()} and the value of the
|
|
\constant{Py_TPFLAGS_HAVE_GC} flag bit.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{inquiry}{tp_is_gc}
|
|
An optional pointer to a function called by the garbage collector.
|
|
|
|
The garbage collector needs to know whether a particular object is
|
|
collectible or not. Normally, it is sufficient to look at the
|
|
object's type's \member{tp_flags} field, and check the
|
|
\constant{Py_TPFLAGS_HAVE_GC} flag bit. But some types have a
|
|
mixture of statically and dynamically allocated instances, and the
|
|
statically allocated instances are not collectible. Such types
|
|
should define this function; it should return \code{1} for a
|
|
collectible instance, and \code{0} for a non-collectible instance.
|
|
The signature is
|
|
|
|
\begin{verbatim}
|
|
int tp_is_gc(PyObject *self)
|
|
\end{verbatim}
|
|
|
|
(The only example of this are types themselves. The metatype,
|
|
\cdata{PyType_Type}, defines this function to distinguish between
|
|
statically and dynamically allocated types.)
|
|
|
|
This field is inherited by subtypes. (VERSION NOTE: in Python
|
|
2.2, it was not inherited. It is inherited in 2.2.1 and later
|
|
versions.)
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{PyObject*}{tp_bases}
|
|
Tuple of base types.
|
|
|
|
This is set for types created by a class statement. It should be
|
|
\NULL{} for statically defined types.
|
|
|
|
This field is not inherited.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{PyObject*}{tp_mro}
|
|
Tuple containing the expanded set of base types, starting with the
|
|
type itself and ending with \class{object}, in Method Resolution
|
|
Order.
|
|
|
|
This field is not inherited; it is calculated fresh by
|
|
\cfunction{PyType_Ready()}.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{PyObject*}{tp_cache}
|
|
Unused. Not inherited. Internal use only.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{PyObject*}{tp_subclasses}
|
|
List of weak references to subclasses. Not inherited. Internal
|
|
use only.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{PyObject*}{tp_weaklist}
|
|
Weak reference list head, for weak references to this type
|
|
object. Not inherited. Internal use only.
|
|
\end{cmemberdesc}
|
|
|
|
The remaining fields are only defined if the feature test macro
|
|
\constant{COUNT_ALLOCS} is defined, and are for internal use only.
|
|
They are documented here for completeness. None of these fields are
|
|
inherited by subtypes.
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{Py_ssize_t}{tp_allocs}
|
|
Number of allocations.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{Py_ssize_t}{tp_frees}
|
|
Number of frees.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{Py_ssize_t}{tp_maxalloc}
|
|
Maximum simultaneously allocated objects.
|
|
\end{cmemberdesc}
|
|
|
|
\begin{cmemberdesc}{PyTypeObject}{PyTypeObject*}{tp_next}
|
|
Pointer to the next type object with a non-zero \member{tp_allocs}
|
|
field.
|
|
\end{cmemberdesc}
|
|
|
|
Also, note that, in a garbage collected Python, tp_dealloc may be
|
|
called from any Python thread, not just the thread which created the
|
|
object (if the object becomes part of a refcount cycle, that cycle
|
|
might be collected by a garbage collection on any thread). This is
|
|
not a problem for Python API calls, since the thread on which
|
|
tp_dealloc is called will own the Global Interpreter Lock (GIL).
|
|
However, if the object being destroyed in turn destroys objects from
|
|
some other C or \Cpp{} library, care should be taken to ensure that
|
|
destroying those objects on the thread which called tp_dealloc will
|
|
not violate any assumptions of the library.
|
|
|
|
\section{Mapping Object Structures \label{mapping-structs}}
|
|
|
|
\begin{ctypedesc}{PyMappingMethods}
|
|
Structure used to hold pointers to the functions used to implement
|
|
the mapping protocol for an extension type.
|
|
\end{ctypedesc}
|
|
|
|
|
|
\section{Number Object Structures \label{number-structs}}
|
|
|
|
\begin{ctypedesc}{PyNumberMethods}
|
|
Structure used to hold pointers to the functions an extension type
|
|
uses to implement the number protocol.
|
|
\end{ctypedesc}
|
|
|
|
|
|
\section{Sequence Object Structures \label{sequence-structs}}
|
|
|
|
\begin{ctypedesc}{PySequenceMethods}
|
|
Structure used to hold pointers to the functions which an object
|
|
uses to implement the sequence protocol.
|
|
\end{ctypedesc}
|
|
|
|
|
|
\section{Buffer Object Structures \label{buffer-structs}}
|
|
\sectionauthor{Greg J. Stein}{greg@lyra.org}
|
|
|
|
The buffer interface exports a model where an object can expose its
|
|
internal data as a set of chunks of data, where each chunk is
|
|
specified as a pointer/length pair. These chunks are called
|
|
\dfn{segments} and are presumed to be non-contiguous in memory.
|
|
|
|
If an object does not export the buffer interface, then its
|
|
\member{tp_as_buffer} member in the \ctype{PyTypeObject} structure
|
|
should be \NULL. Otherwise, the \member{tp_as_buffer} will point to
|
|
a \ctype{PyBufferProcs} structure.
|
|
|
|
\note{It is very important that your \ctype{PyTypeObject} structure
|
|
uses \constant{Py_TPFLAGS_DEFAULT} for the value of the
|
|
\member{tp_flags} member rather than \code{0}. This tells the Python
|
|
runtime that your \ctype{PyBufferProcs} structure contains the
|
|
\member{bf_getcharbuffer} slot. Older versions of Python did not have
|
|
this member, so a new Python interpreter using an old extension needs
|
|
to be able to test for its presence before using it.}
|
|
|
|
\begin{ctypedesc}{PyBufferProcs}
|
|
Structure used to hold the function pointers which define an
|
|
implementation of the buffer protocol.
|
|
|
|
The first slot is \member{bf_getreadbuffer}, of type
|
|
\ctype{getreadbufferproc}. If this slot is \NULL, then the object
|
|
does not support reading from the internal data. This is
|
|
non-sensical, so implementors should fill this in, but callers
|
|
should test that the slot contains a non-\NULL{} value.
|
|
|
|
The next slot is \member{bf_getwritebuffer} having type
|
|
\ctype{getwritebufferproc}. This slot may be \NULL{} if the object
|
|
does not allow writing into its returned buffers.
|
|
|
|
The third slot is \member{bf_getsegcount}, with type
|
|
\ctype{getsegcountproc}. This slot must not be \NULL{} and is used
|
|
to inform the caller how many segments the object contains. Simple
|
|
objects such as \ctype{PyString_Type} and \ctype{PyBuffer_Type}
|
|
objects contain a single segment.
|
|
|
|
The last slot is \member{bf_getcharbuffer}, of type
|
|
\ctype{getcharbufferproc}. This slot will only be present if the
|
|
\constant{Py_TPFLAGS_HAVE_GETCHARBUFFER} flag is present in the
|
|
\member{tp_flags} field of the object's \ctype{PyTypeObject}.
|
|
Before using this slot, the caller should test whether it is present
|
|
by using the
|
|
\cfunction{PyType_HasFeature()}\ttindex{PyType_HasFeature()}
|
|
function. If the flag is present, \member{bf_getcharbuffer} may be
|
|
\NULL,
|
|
indicating that the object's
|
|
contents cannot be used as \emph{8-bit characters}.
|
|
The slot function may also raise an error if the object's contents
|
|
cannot be interpreted as 8-bit characters. For example, if the
|
|
object is an array which is configured to hold floating point
|
|
values, an exception may be raised if a caller attempts to use
|
|
\member{bf_getcharbuffer} to fetch a sequence of 8-bit characters.
|
|
This notion of exporting the internal buffers as ``text'' is used to
|
|
distinguish between objects that are binary in nature, and those
|
|
which have character-based content.
|
|
|
|
\note{The current policy seems to state that these characters
|
|
may be multi-byte characters. This implies that a buffer size of
|
|
\var{N} does not mean there are \var{N} characters present.}
|
|
\end{ctypedesc}
|
|
|
|
\begin{datadesc}{Py_TPFLAGS_HAVE_GETCHARBUFFER}
|
|
Flag bit set in the type structure to indicate that the
|
|
\member{bf_getcharbuffer} slot is known. This being set does not
|
|
indicate that the object supports the buffer interface or that the
|
|
\member{bf_getcharbuffer} slot is non-\NULL.
|
|
\end{datadesc}
|
|
|
|
\begin{ctypedesc}[getreadbufferproc]{Py_ssize_t (*readbufferproc)
|
|
(PyObject *self, Py_ssize_t segment, void **ptrptr)}
|
|
Return a pointer to a readable segment of the buffer in
|
|
\code{*\var{ptrptr}}. This function
|
|
is allowed to raise an exception, in which case it must return
|
|
\code{-1}. The \var{segment} which is specified must be zero or
|
|
positive, and strictly less than the number of segments returned by
|
|
the \member{bf_getsegcount} slot function. On success, it returns
|
|
the length of the segment, and sets \code{*\var{ptrptr}} to a
|
|
pointer to that memory.
|
|
\end{ctypedesc}
|
|
|
|
\begin{ctypedesc}[getwritebufferproc]{Py_ssize_t (*writebufferproc)
|
|
(PyObject *self, Py_ssize_t segment, void **ptrptr)}
|
|
Return a pointer to a writable memory buffer in
|
|
\code{*\var{ptrptr}}, and the length of that segment as the function
|
|
return value. The memory buffer must correspond to buffer segment
|
|
\var{segment}. Must return \code{-1} and set an exception on
|
|
error. \exception{TypeError} should be raised if the object only
|
|
supports read-only buffers, and \exception{SystemError} should be
|
|
raised when \var{segment} specifies a segment that doesn't exist.
|
|
% Why doesn't it raise ValueError for this one?
|
|
% GJS: because you shouldn't be calling it with an invalid
|
|
% segment. That indicates a blatant programming error in the C
|
|
% code.
|
|
\end{ctypedesc}
|
|
|
|
\begin{ctypedesc}[getsegcountproc]{Py_ssize_t (*segcountproc)
|
|
(PyObject *self, Py_ssize_t *lenp)}
|
|
Return the number of memory segments which comprise the buffer. If
|
|
\var{lenp} is not \NULL, the implementation must report the sum of
|
|
the sizes (in bytes) of all segments in \code{*\var{lenp}}.
|
|
The function cannot fail.
|
|
\end{ctypedesc}
|
|
|
|
\begin{ctypedesc}[getcharbufferproc]{Py_ssize_t (*charbufferproc)
|
|
(PyObject *self, Py_ssize_t segment, const char **ptrptr)}
|
|
Return the size of the segment \var{segment} that \var{ptrptr}
|
|
is set to. \code{*\var{ptrptr}} is set to the memory buffer.
|
|
Returns \code{-1} on error.
|
|
\end{ctypedesc}
|
|
|
|
|
|
\section{Supporting the Iterator Protocol
|
|
\label{supporting-iteration}}
|
|
|
|
|
|
\section{Supporting Cyclic Garbage Collection
|
|
\label{supporting-cycle-detection}}
|
|
|
|
Python's support for detecting and collecting garbage which involves
|
|
circular references requires support from object types which are
|
|
``containers'' for other objects which may also be containers. Types
|
|
which do not store references to other objects, or which only store
|
|
references to atomic types (such as numbers or strings), do not need
|
|
to provide any explicit support for garbage collection.
|
|
|
|
An example showing the use of these interfaces can be found in
|
|
``\ulink{Supporting the Cycle
|
|
Collector}{../ext/example-cycle-support.html}'' in
|
|
\citetitle[../ext/ext.html]{Extending and Embedding the Python
|
|
Interpreter}.
|
|
|
|
To create a container type, the \member{tp_flags} field of the type
|
|
object must include the \constant{Py_TPFLAGS_HAVE_GC} and provide an
|
|
implementation of the \member{tp_traverse} handler. If instances of the
|
|
type are mutable, a \member{tp_clear} implementation must also be
|
|
provided.
|
|
|
|
\begin{datadesc}{Py_TPFLAGS_HAVE_GC}
|
|
Objects with a type with this flag set must conform with the rules
|
|
documented here. For convenience these objects will be referred to
|
|
as container objects.
|
|
\end{datadesc}
|
|
|
|
Constructors for container types must conform to two rules:
|
|
|
|
\begin{enumerate}
|
|
\item The memory for the object must be allocated using
|
|
\cfunction{PyObject_GC_New()} or \cfunction{PyObject_GC_VarNew()}.
|
|
|
|
\item Once all the fields which may contain references to other
|
|
containers are initialized, it must call
|
|
\cfunction{PyObject_GC_Track()}.
|
|
\end{enumerate}
|
|
|
|
\begin{cfuncdesc}{\var{TYPE}*}{PyObject_GC_New}{TYPE, PyTypeObject *type}
|
|
Analogous to \cfunction{PyObject_New()} but for container objects with
|
|
the \constant{Py_TPFLAGS_HAVE_GC} flag set.
|
|
\end{cfuncdesc}
|
|
|
|
\begin{cfuncdesc}{\var{TYPE}*}{PyObject_GC_NewVar}{TYPE, PyTypeObject *type,
|
|
Py_ssize_t size}
|
|
Analogous to \cfunction{PyObject_NewVar()} but for container objects
|
|
with the \constant{Py_TPFLAGS_HAVE_GC} flag set.
|
|
\end{cfuncdesc}
|
|
|
|
\begin{cfuncdesc}{PyVarObject *}{PyObject_GC_Resize}{PyVarObject *op, Py_ssize_t}
|
|
Resize an object allocated by \cfunction{PyObject_NewVar()}. Returns
|
|
the resized object or \NULL{} on failure.
|
|
\end{cfuncdesc}
|
|
|
|
\begin{cfuncdesc}{void}{PyObject_GC_Track}{PyObject *op}
|
|
Adds the object \var{op} to the set of container objects tracked by
|
|
the collector. The collector can run at unexpected times so objects
|
|
must be valid while being tracked. This should be called once all
|
|
the fields followed by the \member{tp_traverse} handler become valid,
|
|
usually near the end of the constructor.
|
|
\end{cfuncdesc}
|
|
|
|
\begin{cfuncdesc}{void}{_PyObject_GC_TRACK}{PyObject *op}
|
|
A macro version of \cfunction{PyObject_GC_Track()}. It should not be
|
|
used for extension modules.
|
|
\end{cfuncdesc}
|
|
|
|
Similarly, the deallocator for the object must conform to a similar
|
|
pair of rules:
|
|
|
|
\begin{enumerate}
|
|
\item Before fields which refer to other containers are invalidated,
|
|
\cfunction{PyObject_GC_UnTrack()} must be called.
|
|
|
|
\item The object's memory must be deallocated using
|
|
\cfunction{PyObject_GC_Del()}.
|
|
\end{enumerate}
|
|
|
|
\begin{cfuncdesc}{void}{PyObject_GC_Del}{void *op}
|
|
Releases memory allocated to an object using
|
|
\cfunction{PyObject_GC_New()} or \cfunction{PyObject_GC_NewVar()}.
|
|
\end{cfuncdesc}
|
|
|
|
\begin{cfuncdesc}{void}{PyObject_GC_UnTrack}{void *op}
|
|
Remove the object \var{op} from the set of container objects tracked
|
|
by the collector. Note that \cfunction{PyObject_GC_Track()} can be
|
|
called again on this object to add it back to the set of tracked
|
|
objects. The deallocator (\member{tp_dealloc} handler) should call
|
|
this for the object before any of the fields used by the
|
|
\member{tp_traverse} handler become invalid.
|
|
\end{cfuncdesc}
|
|
|
|
\begin{cfuncdesc}{void}{_PyObject_GC_UNTRACK}{PyObject *op}
|
|
A macro version of \cfunction{PyObject_GC_UnTrack()}. It should not be
|
|
used for extension modules.
|
|
\end{cfuncdesc}
|
|
|
|
The \member{tp_traverse} handler accepts a function parameter of this
|
|
type:
|
|
|
|
\begin{ctypedesc}[visitproc]{int (*visitproc)(PyObject *object, void *arg)}
|
|
Type of the visitor function passed to the \member{tp_traverse}
|
|
handler. The function should be called with an object to traverse
|
|
as \var{object} and the third parameter to the \member{tp_traverse}
|
|
handler as \var{arg}. The Python core uses several visitor functions
|
|
to implement cyclic garbage detection; it's not expected that users will
|
|
need to write their own visitor functions.
|
|
\end{ctypedesc}
|
|
|
|
The \member{tp_traverse} handler must have the following type:
|
|
|
|
\begin{ctypedesc}[traverseproc]{int (*traverseproc)(PyObject *self,
|
|
visitproc visit, void *arg)}
|
|
Traversal function for a container object. Implementations must
|
|
call the \var{visit} function for each object directly contained by
|
|
\var{self}, with the parameters to \var{visit} being the contained
|
|
object and the \var{arg} value passed to the handler. The \var{visit}
|
|
function must not be called with a \NULL{} object argument. If
|
|
\var{visit} returns a non-zero value
|
|
that value should be returned immediately.
|
|
\end{ctypedesc}
|
|
|
|
To simplify writing \member{tp_traverse} handlers, a
|
|
\cfunction{Py_VISIT()} macro is provided. In order to use this macro,
|
|
the \member{tp_traverse} implementation must name its arguments
|
|
exactly \var{visit} and \var{arg}:
|
|
|
|
\begin{cfuncdesc}{void}{Py_VISIT}{PyObject *o}
|
|
Call the \var{visit} callback, with arguments \var{o} and \var{arg}.
|
|
If \var{visit} returns a non-zero value, then return it. Using this
|
|
macro, \member{tp_traverse} handlers look like:
|
|
|
|
\begin{verbatim}
|
|
static int
|
|
my_traverse(Noddy *self, visitproc visit, void *arg)
|
|
{
|
|
Py_VISIT(self->foo);
|
|
Py_VISIT(self->bar);
|
|
return 0;
|
|
}
|
|
\end{verbatim}
|
|
|
|
\versionadded{2.4}
|
|
\end{cfuncdesc}
|
|
|
|
|
|
The \member{tp_clear} handler must be of the \ctype{inquiry} type, or
|
|
\NULL{} if the object is immutable.
|
|
|
|
\begin{ctypedesc}[inquiry]{int (*inquiry)(PyObject *self)}
|
|
Drop references that may have created reference cycles. Immutable
|
|
objects do not have to define this method since they can never
|
|
directly create reference cycles. Note that the object must still
|
|
be valid after calling this method (don't just call
|
|
\cfunction{Py_DECREF()} on a reference). The collector will call
|
|
this method if it detects that this object is involved in a
|
|
reference cycle.
|
|
\end{ctypedesc}
|