]> granicus.if.org Git - python/commitdiff
Add more text from Guido on the type structure fields.
authorFred Drake <fdrake@acm.org>
Tue, 16 Apr 2002 16:22:24 +0000 (16:22 +0000)
committerFred Drake <fdrake@acm.org>
Tue, 16 Apr 2002 16:22:24 +0000 (16:22 +0000)
Small additional changes.

Doc/api/newtypes.tex

index ff3dfb14939b8a6bb563cc283e76f4e7c93f6a60..58162f25ac97a325a7c32934ff00900d975cf2d0 100644 (file)
@@ -388,7 +388,7 @@ Foo_Type.ob_type = &PyType_Type;
   \code{\&PyType_Type}; in Python 2.2.1 and later it will be
   initialized to the \member{ob_type} field of the base class.
   \cfunction{PyType_Ready()} will not change this field if it is
-  nonzero.
+  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.
@@ -480,15 +480,16 @@ Foo_Type.ob_type = &PyType_Type;
   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} slot.  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{PyOject_VarNew()}, or
-  \cfunction{PyObject_GC_Del()} if the instance was allocated using
-  \cfunction{PyObject_GC_New()} or \cfunction{PyObject_GC_VarNew()}.
+  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{PyOject_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}
@@ -710,7 +711,7 @@ PyBufferProcs *tp_as_buffer;
   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 nonzero.
+  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
@@ -841,7 +842,8 @@ PyBufferProcs *tp_as_buffer;
 
 \begin{cmemberdesc}{PyTypeObject}{char*}{tp_doc}
   An optional pointer to a NUL-terminated C string giving the
-  docstring for this type object.
+  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}
@@ -903,25 +905,442 @@ The following three fields only exist if the
 \end{cmemberdesc}
 
 The next field only exists if the \constant{Py_TPFLAGS_HAVE_WEAKREFS}
-flag bit is set.  (XXX ???)
+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}
 
-long tp_weaklistoffset;
+The next two fields only exist if the
+\constant{Py_TPFLAGS_HAVE_CLASS} flag bit is set.
 
-    XXX
+\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()}.
 
-The remaining fields only exist if the
-\constant{Py_TPFLAGS_HAVE_CLASS} flag bit is set.
+  This field is inherited by subtypes.
+\end{cmemberdesc}
 
-/* Added in release 2.2 */
-/* Iterators */
-getiterfunc tp_iter;
+\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).
 
-    XXX
+  Iterator types should also define the \member{tp_iter} function, and
+  that function should return the iterator instance itself (not a new
+  iterator instance).
 
-iternextfunc tp_iternext;
+  This function has the same signature as \cfunction{PyIter_Next()}.
 
-    XXX
+  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.
+
+  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.
+
+  XXX blah, blah.
+
+  This field is inherited by subtypes.
+\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 *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}
+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}
+tp_alloc(PyTypeObject *self, int 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}
+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 completion.  None of these fields are
+inherited by subtypes.
+
+\begin{cmemberdesc}{PyTypeObject}{int}{tp_allocs}
+  Number of allocations.
+\end{cmemberdesc}
+
+\begin{cmemberdesc}{PyTypeObject}{int}{tp_frees}
+  Number of frees.
+\end{cmemberdesc}
+
+\begin{cmemberdesc}{PyTypeObject}{int}{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}
 
 
 \section{Mapping Object Structures \label{mapping-structs}}