* Add "cyclic isolate" to the glossary. * Add a new "Object Life Cycle" page. * Improve docs for related API, with special focus on cross-references and warnings Co-authored-by: Petr Viktorin <encukou@gmail.com> Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
3164 lines
143 KiB
ReStructuredText
3164 lines
143 KiB
ReStructuredText
.. highlight:: c
|
|
|
|
.. _type-structs:
|
|
|
|
Type Object Structures
|
|
======================
|
|
|
|
Perhaps one of the most important structures of the Python object system is the
|
|
structure that defines a new type: the :c:type:`PyTypeObject` structure. Type
|
|
objects can be handled using any of the ``PyObject_*`` or
|
|
``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.
|
|
|
|
In addition to the following quick reference, the :ref:`typedef-examples`
|
|
section provides at-a-glance insight into the meaning and use of
|
|
:c:type:`PyTypeObject`.
|
|
|
|
|
|
Quick Reference
|
|
---------------
|
|
|
|
.. _tp-slots-table:
|
|
|
|
"tp slots"
|
|
^^^^^^^^^^
|
|
|
|
.. table::
|
|
:widths: 18,18,18,1,1,1,1
|
|
|
|
+------------------------------------------------+-----------------------------------+-------------------+---------------+
|
|
| PyTypeObject Slot [#slots]_ | :ref:`Type <slot-typedefs-table>` | special | Info [#cols]_ |
|
|
| | | methods/attrs +---+---+---+---+
|
|
| | | | O | T | D | I |
|
|
+================================================+===================================+===================+===+===+===+===+
|
|
| <R> :c:member:`~PyTypeObject.tp_name` | const char * | __name__ | X | X | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_basicsize` | :c:type:`Py_ssize_t` | | X | X | | X |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_itemsize` | :c:type:`Py_ssize_t` | | | X | | X |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_dealloc` | :c:type:`destructor` | | X | X | | X |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_vectorcall_offset` | :c:type:`Py_ssize_t` | | | X | | X |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| (:c:member:`~PyTypeObject.tp_getattr`) | :c:type:`getattrfunc` | __getattribute__, | | | | G |
|
|
| | | __getattr__ | | | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| (:c:member:`~PyTypeObject.tp_setattr`) | :c:type:`setattrfunc` | __setattr__, | | | | G |
|
|
| | | __delattr__ | | | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_as_async` | :c:type:`PyAsyncMethods` * | :ref:`sub-slots` | | | | % |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_repr` | :c:type:`reprfunc` | __repr__ | X | X | | X |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_as_number` | :c:type:`PyNumberMethods` * | :ref:`sub-slots` | | | | % |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_as_sequence` | :c:type:`PySequenceMethods` * | :ref:`sub-slots` | | | | % |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_as_mapping` | :c:type:`PyMappingMethods` * | :ref:`sub-slots` | | | | % |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_hash` | :c:type:`hashfunc` | __hash__ | X | | | G |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_call` | :c:type:`ternaryfunc` | __call__ | | X | | X |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_str` | :c:type:`reprfunc` | __str__ | X | | | X |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_getattro` | :c:type:`getattrofunc` | __getattribute__, | X | X | | G |
|
|
| | | __getattr__ | | | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_setattro` | :c:type:`setattrofunc` | __setattr__, | X | X | | G |
|
|
| | | __delattr__ | | | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_as_buffer` | :c:type:`PyBufferProcs` * | | | | | % |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_flags` | unsigned long | | X | X | | ? |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_doc` | const char * | __doc__ | X | X | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_traverse` | :c:type:`traverseproc` | | | X | | G |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_clear` | :c:type:`inquiry` | | | X | | G |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_richcompare` | :c:type:`richcmpfunc` | __lt__, | X | | | G |
|
|
| | | __le__, | | | | |
|
|
| | | __eq__, | | | | |
|
|
| | | __ne__, | | | | |
|
|
| | | __gt__, | | | | |
|
|
| | | __ge__ | | | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| (:c:member:`~PyTypeObject.tp_weaklistoffset`) | :c:type:`Py_ssize_t` | | | X | | ? |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_iter` | :c:type:`getiterfunc` | __iter__ | | | | X |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_iternext` | :c:type:`iternextfunc` | __next__ | | | | X |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_methods` | :c:type:`PyMethodDef` [] | | X | X | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_members` | :c:type:`PyMemberDef` [] | | | X | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_getset` | :c:type:`PyGetSetDef` [] | | X | X | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_base` | :c:type:`PyTypeObject` * | __base__ | | | X | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_dict` | :c:type:`PyObject` * | __dict__ | | | ? | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_descr_get` | :c:type:`descrgetfunc` | __get__ | | | | X |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_descr_set` | :c:type:`descrsetfunc` | __set__, | | | | X |
|
|
| | | __delete__ | | | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| (:c:member:`~PyTypeObject.tp_dictoffset`) | :c:type:`Py_ssize_t` | | | X | | ? |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_init` | :c:type:`initproc` | __init__ | X | X | | X |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_alloc` | :c:type:`allocfunc` | | X | | ? | ? |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_new` | :c:type:`newfunc` | __new__ | X | X | ? | ? |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_free` | :c:type:`freefunc` | | X | X | ? | ? |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_is_gc` | :c:type:`inquiry` | | | X | | X |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| <:c:member:`~PyTypeObject.tp_bases`> | :c:type:`PyObject` * | __bases__ | | | ~ | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| <:c:member:`~PyTypeObject.tp_mro`> | :c:type:`PyObject` * | __mro__ | | | ~ | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| [:c:member:`~PyTypeObject.tp_cache`] | :c:type:`PyObject` * | | | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| [:c:member:`~PyTypeObject.tp_subclasses`] | void * | __subclasses__ | | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| [:c:member:`~PyTypeObject.tp_weaklist`] | :c:type:`PyObject` * | | | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| (:c:member:`~PyTypeObject.tp_del`) | :c:type:`destructor` | | | | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| [:c:member:`~PyTypeObject.tp_version_tag`] | unsigned int | | | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_finalize` | :c:type:`destructor` | __del__ | | | | X |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| :c:member:`~PyTypeObject.tp_vectorcall` | :c:type:`vectorcallfunc` | | | | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
| [:c:member:`~PyTypeObject.tp_watched`] | unsigned char | | | | | |
|
|
+------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
|
|
|
|
.. [#slots]
|
|
|
|
**()**: A slot name in parentheses indicates it is (effectively) deprecated.
|
|
|
|
**<>**: Names in angle brackets should be initially set to ``NULL`` and
|
|
treated as read-only.
|
|
|
|
**[]**: Names in square brackets are for internal use only.
|
|
|
|
**<R>** (as a prefix) means the field is required (must be non-``NULL``).
|
|
|
|
.. [#cols] Columns:
|
|
|
|
**"O"**: set on :c:data:`PyBaseObject_Type`
|
|
|
|
**"T"**: set on :c:data:`PyType_Type`
|
|
|
|
**"D"**: default (if slot is set to ``NULL``)
|
|
|
|
.. code-block:: none
|
|
|
|
X - PyType_Ready sets this value if it is NULL
|
|
~ - PyType_Ready always sets this value (it should be NULL)
|
|
? - PyType_Ready may set this value depending on other slots
|
|
|
|
Also see the inheritance column ("I").
|
|
|
|
**"I"**: inheritance
|
|
|
|
.. code-block:: none
|
|
|
|
X - type slot is inherited via *PyType_Ready* if defined with a *NULL* value
|
|
% - the slots of the sub-struct are inherited individually
|
|
G - inherited, but only in combination with other slots; see the slot's description
|
|
? - it's complicated; see the slot's description
|
|
|
|
Note that some slots are effectively inherited through the normal
|
|
attribute lookup chain.
|
|
|
|
.. _sub-slots:
|
|
|
|
sub-slots
|
|
^^^^^^^^^
|
|
|
|
.. table::
|
|
:widths: 26,17,12
|
|
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| Slot | :ref:`Type <slot-typedefs-table>` | special |
|
|
| | | methods |
|
|
+=========================================================+===================================+===============+
|
|
| :c:member:`~PyAsyncMethods.am_await` | :c:type:`unaryfunc` | __await__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyAsyncMethods.am_aiter` | :c:type:`unaryfunc` | __aiter__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyAsyncMethods.am_anext` | :c:type:`unaryfunc` | __anext__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyAsyncMethods.am_send` | :c:type:`sendfunc` | |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_add` | :c:type:`binaryfunc` | __add__ |
|
|
| | | __radd__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_inplace_add` | :c:type:`binaryfunc` | __iadd__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_subtract` | :c:type:`binaryfunc` | __sub__ |
|
|
| | | __rsub__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_inplace_subtract` | :c:type:`binaryfunc` | __isub__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_multiply` | :c:type:`binaryfunc` | __mul__ |
|
|
| | | __rmul__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_inplace_multiply` | :c:type:`binaryfunc` | __imul__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_remainder` | :c:type:`binaryfunc` | __mod__ |
|
|
| | | __rmod__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_inplace_remainder` | :c:type:`binaryfunc` | __imod__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_divmod` | :c:type:`binaryfunc` | __divmod__ |
|
|
| | | __rdivmod__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_power` | :c:type:`ternaryfunc` | __pow__ |
|
|
| | | __rpow__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_inplace_power` | :c:type:`ternaryfunc` | __ipow__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_negative` | :c:type:`unaryfunc` | __neg__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_positive` | :c:type:`unaryfunc` | __pos__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_absolute` | :c:type:`unaryfunc` | __abs__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_bool` | :c:type:`inquiry` | __bool__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_invert` | :c:type:`unaryfunc` | __invert__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_lshift` | :c:type:`binaryfunc` | __lshift__ |
|
|
| | | __rlshift__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_inplace_lshift` | :c:type:`binaryfunc` | __ilshift__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_rshift` | :c:type:`binaryfunc` | __rshift__ |
|
|
| | | __rrshift__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_inplace_rshift` | :c:type:`binaryfunc` | __irshift__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_and` | :c:type:`binaryfunc` | __and__ |
|
|
| | | __rand__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_inplace_and` | :c:type:`binaryfunc` | __iand__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_xor` | :c:type:`binaryfunc` | __xor__ |
|
|
| | | __rxor__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_inplace_xor` | :c:type:`binaryfunc` | __ixor__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_or` | :c:type:`binaryfunc` | __or__ |
|
|
| | | __ror__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_inplace_or` | :c:type:`binaryfunc` | __ior__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_int` | :c:type:`unaryfunc` | __int__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_reserved` | void * | |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_float` | :c:type:`unaryfunc` | __float__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_floor_divide` | :c:type:`binaryfunc` | __floordiv__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_inplace_floor_divide` | :c:type:`binaryfunc` | __ifloordiv__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_true_divide` | :c:type:`binaryfunc` | __truediv__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_inplace_true_divide` | :c:type:`binaryfunc` | __itruediv__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_index` | :c:type:`unaryfunc` | __index__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_matrix_multiply` | :c:type:`binaryfunc` | __matmul__ |
|
|
| | | __rmatmul__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyNumberMethods.nb_inplace_matrix_multiply` | :c:type:`binaryfunc` | __imatmul__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyMappingMethods.mp_length` | :c:type:`lenfunc` | __len__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyMappingMethods.mp_subscript` | :c:type:`binaryfunc` | __getitem__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyMappingMethods.mp_ass_subscript` | :c:type:`objobjargproc` | __setitem__, |
|
|
| | | __delitem__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PySequenceMethods.sq_length` | :c:type:`lenfunc` | __len__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PySequenceMethods.sq_concat` | :c:type:`binaryfunc` | __add__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PySequenceMethods.sq_repeat` | :c:type:`ssizeargfunc` | __mul__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PySequenceMethods.sq_item` | :c:type:`ssizeargfunc` | __getitem__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PySequenceMethods.sq_ass_item` | :c:type:`ssizeobjargproc` | __setitem__ |
|
|
| | | __delitem__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PySequenceMethods.sq_contains` | :c:type:`objobjproc` | __contains__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PySequenceMethods.sq_inplace_concat` | :c:type:`binaryfunc` | __iadd__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PySequenceMethods.sq_inplace_repeat` | :c:type:`ssizeargfunc` | __imul__ |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyBufferProcs.bf_getbuffer` | :c:func:`getbufferproc` | |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
| :c:member:`~PyBufferProcs.bf_releasebuffer` | :c:func:`releasebufferproc` | |
|
|
+---------------------------------------------------------+-----------------------------------+---------------+
|
|
|
|
.. _slot-typedefs-table:
|
|
|
|
slot typedefs
|
|
^^^^^^^^^^^^^
|
|
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| typedef | Parameter Types | Return Type |
|
|
+=============================+=============================+======================+
|
|
| :c:type:`allocfunc` | .. line-block:: | :c:type:`PyObject` * |
|
|
| | | |
|
|
| | :c:type:`PyTypeObject` * | |
|
|
| | :c:type:`Py_ssize_t` | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`destructor` | :c:type:`PyObject` * | void |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`freefunc` | void * | void |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`traverseproc` | .. line-block:: | int |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`visitproc` | |
|
|
| | void * | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`newfunc` | .. line-block:: | :c:type:`PyObject` * |
|
|
| | | |
|
|
| | :c:type:`PyTypeObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`initproc` | .. line-block:: | int |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`reprfunc` | :c:type:`PyObject` * | :c:type:`PyObject` * |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`getattrfunc` | .. line-block:: | :c:type:`PyObject` * |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | const char * | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`setattrfunc` | .. line-block:: | int |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | const char * | |
|
|
| | :c:type:`PyObject` * | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`getattrofunc` | .. line-block:: | :c:type:`PyObject` * |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`setattrofunc` | .. line-block:: | int |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`descrgetfunc` | .. line-block:: | :c:type:`PyObject` * |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`descrsetfunc` | .. line-block:: | int |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`hashfunc` | :c:type:`PyObject` * | Py_hash_t |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`richcmpfunc` | .. line-block:: | :c:type:`PyObject` * |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | int | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`getiterfunc` | :c:type:`PyObject` * | :c:type:`PyObject` * |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`iternextfunc` | :c:type:`PyObject` * | :c:type:`PyObject` * |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`lenfunc` | :c:type:`PyObject` * | :c:type:`Py_ssize_t` |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`getbufferproc` | .. line-block:: | int |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`Py_buffer` * | |
|
|
| | int | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`releasebufferproc` | .. line-block:: | void |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`Py_buffer` * | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`inquiry` | :c:type:`PyObject` * | int |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`unaryfunc` | .. line-block:: | :c:type:`PyObject` * |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`binaryfunc` | .. line-block:: | :c:type:`PyObject` * |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`ternaryfunc` | .. line-block:: | :c:type:`PyObject` * |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`ssizeargfunc` | .. line-block:: | :c:type:`PyObject` * |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`Py_ssize_t` | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`ssizeobjargproc` | .. line-block:: | int |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`Py_ssize_t` | |
|
|
| | :c:type:`PyObject` * | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`objobjproc` | .. line-block:: | int |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
| :c:type:`objobjargproc` | .. line-block:: | int |
|
|
| | | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
| | :c:type:`PyObject` * | |
|
|
+-----------------------------+-----------------------------+----------------------+
|
|
|
|
See :ref:`slot-typedefs` below for more detail.
|
|
|
|
|
|
PyTypeObject Definition
|
|
-----------------------
|
|
|
|
The structure definition for :c:type:`PyTypeObject` can be found in
|
|
:file:`Include/cpython/object.h`. For convenience of reference, this repeats the
|
|
definition found there:
|
|
|
|
.. XXX Drop this?
|
|
|
|
.. literalinclude:: ../includes/typestruct.h
|
|
|
|
|
|
PyObject Slots
|
|
--------------
|
|
|
|
The type object structure extends the :c:type:`PyVarObject` structure. The
|
|
:c:member:`~PyVarObject.ob_size` field is used for dynamic types (created by :c:func:`!type_new`,
|
|
usually called from a class statement). Note that :c:data:`PyType_Type` (the
|
|
metatype) initializes :c:member:`~PyTypeObject.tp_itemsize`, which means that its instances (i.e.
|
|
type objects) *must* have the :c:member:`~PyVarObject.ob_size` field.
|
|
|
|
|
|
.. c:member:: Py_ssize_t PyObject.ob_refcnt
|
|
|
|
This is the type object's reference count, initialized to ``1`` by the
|
|
``PyObject_HEAD_INIT`` macro. Note that for :ref:`statically allocated type
|
|
objects <static-types>`, the type's instances (objects whose :c:member:`~PyObject.ob_type`
|
|
points back to the type) do *not* count as references. But for
|
|
:ref:`dynamically allocated type objects <heap-types>`, the instances *do*
|
|
count as references.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is not inherited by subtypes.
|
|
|
|
|
|
.. c:member:: PyTypeObject* PyObject.ob_type
|
|
|
|
This is the type's type, in other words its metatype. It is initialized by the
|
|
argument to the ``PyObject_HEAD_INIT`` macro, and its value should normally be
|
|
``&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
|
|
``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::
|
|
|
|
Foo_Type.ob_type = &PyType_Type;
|
|
|
|
This should be done before any instances of the type are created.
|
|
:c:func:`PyType_Ready` checks if :c:member:`~PyObject.ob_type` is ``NULL``, and if so,
|
|
initializes it to the :c:member:`~PyObject.ob_type` field of the base class.
|
|
:c:func:`PyType_Ready` will not change this field if it is non-zero.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is inherited by subtypes.
|
|
|
|
|
|
PyVarObject Slots
|
|
-----------------
|
|
|
|
.. c:member:: Py_ssize_t PyVarObject.ob_size
|
|
|
|
For :ref:`statically allocated type objects <static-types>`, this should be
|
|
initialized to zero. For :ref:`dynamically allocated type objects
|
|
<heap-types>`, this field has a special internal meaning.
|
|
|
|
This field should be accessed using the :c:func:`Py_SIZE()` and
|
|
:c:func:`Py_SET_SIZE()` macros.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is not inherited by subtypes.
|
|
|
|
|
|
PyTypeObject Slots
|
|
------------------
|
|
|
|
Each slot has a section describing inheritance. If :c:func:`PyType_Ready`
|
|
may set a value when the field is set to ``NULL`` then there will also be
|
|
a "Default" section. (Note that many fields set on :c:data:`PyBaseObject_Type`
|
|
and :c:data:`PyType_Type` effectively act as defaults.)
|
|
|
|
.. c:member:: const char* PyTypeObject.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 :mod:`!M` in subpackage :mod:`!Q` in package :mod:`!P`
|
|
should have the :c:member:`~PyTypeObject.tp_name` initializer ``"P.Q.M.T"``.
|
|
|
|
For :ref:`dynamically allocated type objects <heap-types>`,
|
|
this should just be the type name, and
|
|
the module name explicitly stored in the type dict as the value for key
|
|
``'__module__'``.
|
|
|
|
For :ref:`statically allocated type objects <static-types>`,
|
|
the *tp_name* field should contain a dot.
|
|
Everything before the last dot is made accessible as the :attr:`~type.__module__`
|
|
attribute, and everything after the last dot is made accessible as the
|
|
:attr:`~type.__name__` attribute.
|
|
|
|
If no dot is present, the entire :c:member:`~PyTypeObject.tp_name` field is made accessible as the
|
|
:attr:`~type.__name__` attribute, and the :attr:`~type.__module__` attribute is undefined
|
|
(unless explicitly set in the dictionary, as explained above). This means your
|
|
type will be impossible to pickle. Additionally, it will not be listed in
|
|
module documentations created with pydoc.
|
|
|
|
This field must not be ``NULL``. It is the only required field
|
|
in :c:func:`PyTypeObject` (other than potentially
|
|
:c:member:`~PyTypeObject.tp_itemsize`).
|
|
|
|
**Inheritance:**
|
|
|
|
This field is not inherited by subtypes.
|
|
|
|
|
|
.. c:member:: Py_ssize_t PyTypeObject.tp_basicsize
|
|
Py_ssize_t PyTypeObject.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
|
|
:c:member:`!tp_itemsize` field, types with variable-length instances have a non-zero
|
|
:c:member:`!tp_itemsize` field. For a type with fixed-length instances, all
|
|
instances have the same size, given in :c:member:`!tp_basicsize`.
|
|
(Exceptions to this rule can be made using
|
|
:c:func:`PyUnstable_Object_GC_NewWithExtraData`.)
|
|
|
|
For a type with variable-length instances, the instances must have an
|
|
:c:member:`~PyVarObject.ob_size` field, and the instance size is
|
|
:c:member:`!tp_basicsize` plus N times :c:member:`!tp_itemsize`,
|
|
where N is the "length" of the object.
|
|
|
|
Functions like :c:func:`PyObject_NewVar` will take the value of N as an
|
|
argument, and store in the instance's :c:member:`~PyVarObject.ob_size` field.
|
|
Note that the :c:member:`~PyVarObject.ob_size` field may later be used for
|
|
other purposes. For example, :py:type:`int` instances use the bits of
|
|
:c:member:`~PyVarObject.ob_size` in an implementation-defined
|
|
way; the underlying storage and its size should be accessed using
|
|
:c:func:`PyLong_Export`.
|
|
|
|
.. note::
|
|
|
|
The :c:member:`~PyVarObject.ob_size` field should be accessed using
|
|
the :c:func:`Py_SIZE()` and :c:func:`Py_SET_SIZE()` macros.
|
|
|
|
Also, the presence of an :c:member:`~PyVarObject.ob_size` field in the
|
|
instance layout doesn't mean that the instance structure is variable-length.
|
|
For example, the :py:type:`list` type has fixed-length instances, yet those
|
|
instances have a :c:member:`~PyVarObject.ob_size` field.
|
|
(As with :py:type:`int`, avoid reading lists' :c:member:`!ob_size` directly.
|
|
Call :c:func:`PyList_Size` instead.)
|
|
|
|
The :c:member:`!tp_basicsize` includes size needed for data of the type's
|
|
:c:member:`~PyTypeObject.tp_base`, plus any extra data needed
|
|
by each instance.
|
|
|
|
The correct way to set :c:member:`!tp_basicsize` is to use the
|
|
``sizeof`` operator on the struct used to declare the instance layout.
|
|
This struct must include the struct used to declare the base type.
|
|
In other words, :c:member:`!tp_basicsize` must be greater than or equal
|
|
to the base's :c:member:`!tp_basicsize`.
|
|
|
|
Since every type is a subtype of :py:type:`object`, this struct must
|
|
include :c:type:`PyObject` or :c:type:`PyVarObject` (depending on
|
|
whether :c:member:`~PyVarObject.ob_size` should be included). These are
|
|
usually defined by the macro :c:macro:`PyObject_HEAD` or
|
|
:c:macro:`PyObject_VAR_HEAD`, respectively.
|
|
|
|
The basic size does not include the GC header size, as that header is not
|
|
part of :c:macro:`PyObject_HEAD`.
|
|
|
|
For cases where struct used to declare the base type is unknown,
|
|
see :c:member:`PyType_Spec.basicsize` and :c:func:`PyType_FromMetaclass`.
|
|
|
|
Notes about alignment:
|
|
|
|
- :c:member:`!tp_basicsize` must be a multiple of ``_Alignof(PyObject)``.
|
|
When using ``sizeof`` on a ``struct`` that includes
|
|
:c:macro:`PyObject_HEAD`, as recommended, the compiler ensures this.
|
|
When not using a C ``struct``, or when using compiler
|
|
extensions like ``__attribute__((packed))``, it is up to you.
|
|
- If the variable items require a particular alignment,
|
|
:c:member:`!tp_basicsize` and :c:member:`!tp_itemsize` must each be a
|
|
multiple of that alignment.
|
|
For example, if a type's variable part stores a ``double``, it is
|
|
your responsibility that both fields are a multiple of
|
|
``_Alignof(double)``.
|
|
|
|
**Inheritance:**
|
|
|
|
These fields are inherited separately by subtypes.
|
|
(That is, if the field is set to zero, :c:func:`PyType_Ready` will copy
|
|
the value from the base type, indicating that the instances do not
|
|
need additional storage.)
|
|
|
|
If the base type has a non-zero :c:member:`~PyTypeObject.tp_itemsize`, it is generally not safe to set
|
|
:c:member:`~PyTypeObject.tp_itemsize` to a different non-zero value in a subtype (though this
|
|
depends on the implementation of the base type).
|
|
|
|
|
|
.. c:member:: destructor PyTypeObject.tp_dealloc
|
|
|
|
A pointer to the instance destructor function. The function signature is::
|
|
|
|
void tp_dealloc(PyObject *self);
|
|
|
|
The destructor function should remove all references which the instance owns
|
|
(e.g., call :c:func:`Py_CLEAR`), free all memory buffers owned by the
|
|
instance, and call the type's :c:member:`~PyTypeObject.tp_free` function to
|
|
free the object itself.
|
|
|
|
No guarantees are made about when an object is destroyed, except:
|
|
|
|
* Python will destroy an object immediately or some time after the final
|
|
reference to the object is deleted, unless its finalizer
|
|
(:c:member:`~PyTypeObject.tp_finalize`) subsequently resurrects the
|
|
object.
|
|
* An object will not be destroyed while it is being automatically finalized
|
|
(:c:member:`~PyTypeObject.tp_finalize`) or automatically cleared
|
|
(:c:member:`~PyTypeObject.tp_clear`).
|
|
|
|
CPython currently destroys an object immediately from :c:func:`Py_DECREF`
|
|
when the new reference count is zero, but this may change in a future
|
|
version.
|
|
|
|
It is recommended to call :c:func:`PyObject_CallFinalizerFromDealloc` at the
|
|
beginning of :c:member:`!tp_dealloc` to guarantee that the object is always
|
|
finalized before destruction.
|
|
|
|
If the type supports garbage collection (the :c:macro:`Py_TPFLAGS_HAVE_GC`
|
|
flag is set), the destructor should call :c:func:`PyObject_GC_UnTrack`
|
|
before clearing any member fields.
|
|
|
|
It is permissible to call :c:member:`~PyTypeObject.tp_clear` from
|
|
:c:member:`!tp_dealloc` to reduce code duplication and to guarantee that the
|
|
object is always cleared before destruction. Beware that
|
|
:c:member:`!tp_clear` might have already been called.
|
|
|
|
If the type is heap allocated (:c:macro:`Py_TPFLAGS_HEAPTYPE`), the
|
|
deallocator should release the owned reference to its type object (via
|
|
:c:func:`Py_DECREF`) after calling the type deallocator. See the example
|
|
code below.::
|
|
|
|
static void
|
|
foo_dealloc(PyObject *op)
|
|
{
|
|
foo_object *self = (foo_object *) op;
|
|
PyObject_GC_UnTrack(self);
|
|
Py_CLEAR(self->ref);
|
|
Py_TYPE(self)->tp_free(self);
|
|
}
|
|
|
|
:c:member:`!tp_dealloc` must leave the exception status unchanged. If it
|
|
needs to call something that might raise an exception, the exception state
|
|
must be backed up first and restored later (after logging any exceptions
|
|
with :c:func:`PyErr_WriteUnraisable`).
|
|
|
|
Example::
|
|
|
|
static void
|
|
foo_dealloc(PyObject *self)
|
|
{
|
|
PyObject *exc = PyErr_GetRaisedException();
|
|
|
|
if (PyObject_CallFinalizerFromDealloc(self) < 0) {
|
|
// self was resurrected.
|
|
goto done;
|
|
}
|
|
|
|
PyTypeObject *tp = Py_TYPE(self);
|
|
|
|
if (tp->tp_flags & Py_TPFLAGS_HAVE_GC) {
|
|
PyObject_GC_UnTrack(self);
|
|
}
|
|
|
|
// Optional, but convenient to avoid code duplication.
|
|
if (tp->tp_clear && tp->tp_clear(self) < 0) {
|
|
PyErr_WriteUnraisable(self);
|
|
}
|
|
|
|
// Any additional destruction goes here.
|
|
|
|
tp->tp_free(self);
|
|
self = NULL; // In case PyErr_WriteUnraisable() is called below.
|
|
|
|
if (tp->tp_flags & Py_TPFLAGS_HEAPTYPE) {
|
|
Py_CLEAR(tp);
|
|
}
|
|
|
|
done:
|
|
// Optional, if something was called that might have raised an
|
|
// exception.
|
|
if (PyErr_Occurred()) {
|
|
PyErr_WriteUnraisable(self);
|
|
}
|
|
PyErr_SetRaisedException(exc);
|
|
}
|
|
|
|
:c:member:`!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 :c:member:`!tp_dealloc` is called
|
|
with an :term:`attached thread state`. However, if the object being
|
|
destroyed in turn destroys objects from some other C library, care
|
|
should be taken to ensure that destroying those objects on the thread
|
|
which called :c:member:`!tp_dealloc` will not violate any assumptions of
|
|
the library.
|
|
|
|
|
|
**Inheritance:**
|
|
|
|
This field is inherited by subtypes.
|
|
|
|
.. seealso::
|
|
|
|
:ref:`life-cycle` for details about how this slot relates to other slots.
|
|
|
|
|
|
.. c:member:: Py_ssize_t PyTypeObject.tp_vectorcall_offset
|
|
|
|
An optional offset to a per-instance function that implements calling
|
|
the object using the :ref:`vectorcall protocol <vectorcall>`,
|
|
a more efficient alternative
|
|
of the simpler :c:member:`~PyTypeObject.tp_call`.
|
|
|
|
This field is only used if the flag :c:macro:`Py_TPFLAGS_HAVE_VECTORCALL`
|
|
is set. If so, this must be a positive integer containing the offset in the
|
|
instance of a :c:type:`vectorcallfunc` pointer.
|
|
|
|
The *vectorcallfunc* pointer may be ``NULL``, in which case the instance behaves
|
|
as if :c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` was not set: calling the instance
|
|
falls back to :c:member:`~PyTypeObject.tp_call`.
|
|
|
|
Any class that sets ``Py_TPFLAGS_HAVE_VECTORCALL`` must also set
|
|
:c:member:`~PyTypeObject.tp_call` and make sure its behaviour is consistent
|
|
with the *vectorcallfunc* function.
|
|
This can be done by setting *tp_call* to :c:func:`PyVectorcall_Call`.
|
|
|
|
.. versionchanged:: 3.8
|
|
|
|
Before version 3.8, this slot was named ``tp_print``.
|
|
In Python 2.x, it was used for printing to a file.
|
|
In Python 3.0 to 3.7, it was unused.
|
|
|
|
.. versionchanged:: 3.12
|
|
|
|
Before version 3.12, it was not recommended for
|
|
:ref:`mutable heap types <heap-types>` to implement the vectorcall
|
|
protocol.
|
|
When a user sets :attr:`~object.__call__` in Python code, only *tp_call* is
|
|
updated, likely making it inconsistent with the vectorcall function.
|
|
Since 3.12, setting ``__call__`` will disable vectorcall optimization
|
|
by clearing the :c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` flag.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is always inherited.
|
|
However, the :c:macro:`Py_TPFLAGS_HAVE_VECTORCALL` flag is not
|
|
always inherited. If it's not set, then the subclass won't use
|
|
:ref:`vectorcall <vectorcall>`, except when
|
|
:c:func:`PyVectorcall_Call` is explicitly called.
|
|
|
|
|
|
.. c:member:: getattrfunc PyTypeObject.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 :c:member:`~PyTypeObject.tp_getattro` function, but taking a C string
|
|
instead of a Python string object to give the attribute name.
|
|
|
|
**Inheritance:**
|
|
|
|
Group: :c:member:`~PyTypeObject.tp_getattr`, :c:member:`~PyTypeObject.tp_getattro`
|
|
|
|
This field is inherited by subtypes together with :c:member:`~PyTypeObject.tp_getattro`: a subtype
|
|
inherits both :c:member:`~PyTypeObject.tp_getattr` and :c:member:`~PyTypeObject.tp_getattro` from its base type when
|
|
the subtype's :c:member:`~PyTypeObject.tp_getattr` and :c:member:`~PyTypeObject.tp_getattro` are both ``NULL``.
|
|
|
|
|
|
.. c:member:: setattrfunc PyTypeObject.tp_setattr
|
|
|
|
An optional pointer to the function for setting and deleting attributes.
|
|
|
|
This field is deprecated. When it is defined, it should point to a function
|
|
that acts the same as the :c:member:`~PyTypeObject.tp_setattro` function, but taking a C string
|
|
instead of a Python string object to give the attribute name.
|
|
|
|
**Inheritance:**
|
|
|
|
Group: :c:member:`~PyTypeObject.tp_setattr`, :c:member:`~PyTypeObject.tp_setattro`
|
|
|
|
This field is inherited by subtypes together with :c:member:`~PyTypeObject.tp_setattro`: a subtype
|
|
inherits both :c:member:`~PyTypeObject.tp_setattr` and :c:member:`~PyTypeObject.tp_setattro` from its base type when
|
|
the subtype's :c:member:`~PyTypeObject.tp_setattr` and :c:member:`~PyTypeObject.tp_setattro` are both ``NULL``.
|
|
|
|
|
|
.. c:member:: PyAsyncMethods* PyTypeObject.tp_as_async
|
|
|
|
Pointer to an additional structure that contains fields relevant only to
|
|
objects which implement :term:`awaitable` and :term:`asynchronous iterator`
|
|
protocols at the C-level. See :ref:`async-structs` for details.
|
|
|
|
.. versionadded:: 3.5
|
|
Formerly known as ``tp_compare`` and ``tp_reserved``.
|
|
|
|
**Inheritance:**
|
|
|
|
The :c:member:`~PyTypeObject.tp_as_async` field is not inherited,
|
|
but the contained fields are inherited individually.
|
|
|
|
|
|
.. c:member:: reprfunc PyTypeObject.tp_repr
|
|
|
|
.. index:: pair: built-in function; repr
|
|
|
|
An optional pointer to a function that implements the built-in function
|
|
:func:`repr`.
|
|
|
|
The signature is the same as for :c:func:`PyObject_Repr`::
|
|
|
|
PyObject *tp_repr(PyObject *self);
|
|
|
|
The function must return a string or a Unicode object. Ideally,
|
|
this function should return a string that, when passed to
|
|
:func:`eval`, given a suitable environment, returns an object with the
|
|
same value. If this is not feasible, it should return a string starting with
|
|
``'<'`` and ending with ``'>'`` from which both the type and the value of the
|
|
object can be deduced.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is inherited by subtypes.
|
|
|
|
**Default:**
|
|
|
|
When this field is not set, a string of the form ``<%s object at %p>`` is
|
|
returned, where ``%s`` is replaced by the type name, and ``%p`` by the object's
|
|
memory address.
|
|
|
|
|
|
.. c:member:: PyNumberMethods* PyTypeObject.tp_as_number
|
|
|
|
Pointer to an additional structure that contains fields relevant only to
|
|
objects which implement the number protocol. These fields are documented in
|
|
:ref:`number-structs`.
|
|
|
|
**Inheritance:**
|
|
|
|
The :c:member:`~PyTypeObject.tp_as_number` field is not inherited, but the contained fields are
|
|
inherited individually.
|
|
|
|
|
|
.. c:member:: PySequenceMethods* PyTypeObject.tp_as_sequence
|
|
|
|
Pointer to an additional structure that contains fields relevant only to
|
|
objects which implement the sequence protocol. These fields are documented
|
|
in :ref:`sequence-structs`.
|
|
|
|
**Inheritance:**
|
|
|
|
The :c:member:`~PyTypeObject.tp_as_sequence` field is not inherited, but the contained fields
|
|
are inherited individually.
|
|
|
|
|
|
.. c:member:: PyMappingMethods* PyTypeObject.tp_as_mapping
|
|
|
|
Pointer to an additional structure that contains fields relevant only to
|
|
objects which implement the mapping protocol. These fields are documented in
|
|
:ref:`mapping-structs`.
|
|
|
|
**Inheritance:**
|
|
|
|
The :c:member:`~PyTypeObject.tp_as_mapping` field is not inherited, but the contained fields
|
|
are inherited individually.
|
|
|
|
|
|
.. c:member:: hashfunc PyTypeObject.tp_hash
|
|
|
|
.. index:: pair: built-in function; hash
|
|
|
|
An optional pointer to a function that implements the built-in function
|
|
:func:`hash`.
|
|
|
|
The signature is the same as for :c:func:`PyObject_Hash`::
|
|
|
|
Py_hash_t tp_hash(PyObject *);
|
|
|
|
The value ``-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 ``-1``.
|
|
|
|
When this field is not set (*and* :c:member:`~PyTypeObject.tp_richcompare` is not set),
|
|
an attempt to take the hash of the object raises :exc:`TypeError`.
|
|
This is the same as setting it to :c:func:`PyObject_HashNotImplemented`.
|
|
|
|
This field can be set explicitly to :c:func:`PyObject_HashNotImplemented` to
|
|
block inheritance of the hash method from a parent type. This is interpreted
|
|
as the equivalent of ``__hash__ = None`` at the Python level, causing
|
|
``isinstance(o, collections.Hashable)`` to correctly return ``False``. Note
|
|
that the converse is also true - setting ``__hash__ = None`` on a class at
|
|
the Python level will result in the ``tp_hash`` slot being set to
|
|
:c:func:`PyObject_HashNotImplemented`.
|
|
|
|
**Inheritance:**
|
|
|
|
Group: :c:member:`~PyTypeObject.tp_hash`, :c:member:`~PyTypeObject.tp_richcompare`
|
|
|
|
This field is inherited by subtypes together with
|
|
:c:member:`~PyTypeObject.tp_richcompare`: a subtype inherits both of
|
|
:c:member:`~PyTypeObject.tp_richcompare` and :c:member:`~PyTypeObject.tp_hash`, when the subtype's
|
|
:c:member:`~PyTypeObject.tp_richcompare` and :c:member:`~PyTypeObject.tp_hash` are both ``NULL``.
|
|
|
|
**Default:**
|
|
|
|
:c:data:`PyBaseObject_Type` uses :c:func:`PyObject_GenericHash`.
|
|
|
|
|
|
.. c:member:: ternaryfunc PyTypeObject.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 :c:func:`PyObject_Call`::
|
|
|
|
PyObject *tp_call(PyObject *self, PyObject *args, PyObject *kwargs);
|
|
|
|
**Inheritance:**
|
|
|
|
This field is inherited by subtypes.
|
|
|
|
|
|
.. c:member:: reprfunc PyTypeObject.tp_str
|
|
|
|
An optional pointer to a function that implements the built-in operation
|
|
:func:`str`. (Note that :class:`str` is a type now, and :func:`str` calls the
|
|
constructor for that type. This constructor calls :c:func:`PyObject_Str` to do
|
|
the actual work, and :c:func:`PyObject_Str` will call this handler.)
|
|
|
|
The signature is the same as for :c:func:`PyObject_Str`::
|
|
|
|
PyObject *tp_str(PyObject *self);
|
|
|
|
The function must return a string or a Unicode object. It should be a "friendly" string
|
|
representation of the object, as this is the representation that will be used,
|
|
among other things, by the :func:`print` function.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is inherited by subtypes.
|
|
|
|
**Default:**
|
|
|
|
When this field is not set, :c:func:`PyObject_Repr` is called to return a string
|
|
representation.
|
|
|
|
|
|
.. c:member:: getattrofunc PyTypeObject.tp_getattro
|
|
|
|
An optional pointer to the get-attribute function.
|
|
|
|
The signature is the same as for :c:func:`PyObject_GetAttr`::
|
|
|
|
PyObject *tp_getattro(PyObject *self, PyObject *attr);
|
|
|
|
It is usually convenient to set this field to :c:func:`PyObject_GenericGetAttr`,
|
|
which implements the normal way of looking for object attributes.
|
|
|
|
**Inheritance:**
|
|
|
|
Group: :c:member:`~PyTypeObject.tp_getattr`, :c:member:`~PyTypeObject.tp_getattro`
|
|
|
|
This field is inherited by subtypes together with :c:member:`~PyTypeObject.tp_getattr`: a subtype
|
|
inherits both :c:member:`~PyTypeObject.tp_getattr` and :c:member:`~PyTypeObject.tp_getattro` from its base type when
|
|
the subtype's :c:member:`~PyTypeObject.tp_getattr` and :c:member:`~PyTypeObject.tp_getattro` are both ``NULL``.
|
|
|
|
**Default:**
|
|
|
|
:c:data:`PyBaseObject_Type` uses :c:func:`PyObject_GenericGetAttr`.
|
|
|
|
|
|
.. c:member:: setattrofunc PyTypeObject.tp_setattro
|
|
|
|
An optional pointer to the function for setting and deleting attributes.
|
|
|
|
The signature is the same as for :c:func:`PyObject_SetAttr`::
|
|
|
|
int tp_setattro(PyObject *self, PyObject *attr, PyObject *value);
|
|
|
|
In addition, setting *value* to ``NULL`` to delete an attribute must be
|
|
supported. It is usually convenient to set this field to
|
|
:c:func:`PyObject_GenericSetAttr`, which implements the normal
|
|
way of setting object attributes.
|
|
|
|
**Inheritance:**
|
|
|
|
Group: :c:member:`~PyTypeObject.tp_setattr`, :c:member:`~PyTypeObject.tp_setattro`
|
|
|
|
This field is inherited by subtypes together with :c:member:`~PyTypeObject.tp_setattr`: a subtype
|
|
inherits both :c:member:`~PyTypeObject.tp_setattr` and :c:member:`~PyTypeObject.tp_setattro` from its base type when
|
|
the subtype's :c:member:`~PyTypeObject.tp_setattr` and :c:member:`~PyTypeObject.tp_setattro` are both ``NULL``.
|
|
|
|
**Default:**
|
|
|
|
:c:data:`PyBaseObject_Type` uses :c:func:`PyObject_GenericSetAttr`.
|
|
|
|
|
|
.. c:member:: PyBufferProcs* PyTypeObject.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
|
|
:ref:`buffer-structs`.
|
|
|
|
**Inheritance:**
|
|
|
|
The :c:member:`~PyTypeObject.tp_as_buffer` field is not inherited,
|
|
but the contained fields are inherited individually.
|
|
|
|
|
|
.. c:member:: unsigned long PyTypeObject.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
|
|
:c:member:`~PyTypeObject.tp_as_number`, :c:member:`~PyTypeObject.tp_as_sequence`, :c:member:`~PyTypeObject.tp_as_mapping`, and
|
|
:c:member:`~PyTypeObject.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:**
|
|
|
|
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 :c:macro:`Py_TPFLAGS_HAVE_GC` flag bit is inherited together with
|
|
the :c:member:`~PyTypeObject.tp_traverse` and :c:member:`~PyTypeObject.tp_clear` fields, i.e. if the
|
|
:c:macro:`Py_TPFLAGS_HAVE_GC` flag bit is clear in the subtype and the
|
|
:c:member:`~PyTypeObject.tp_traverse` and :c:member:`~PyTypeObject.tp_clear` fields in the subtype exist and have
|
|
``NULL`` values.
|
|
|
|
.. XXX are most flag bits *really* inherited individually?
|
|
|
|
**Default:**
|
|
|
|
:c:data:`PyBaseObject_Type` uses
|
|
``Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE``.
|
|
|
|
**Bit Masks:**
|
|
|
|
.. c:namespace:: NULL
|
|
|
|
The following bit masks are currently defined; these can be ORed together using
|
|
the ``|`` operator to form the value of the :c:member:`~PyTypeObject.tp_flags` field. The macro
|
|
:c:func:`PyType_HasFeature` takes a type and a flags value, *tp* and *f*, and
|
|
checks whether ``tp->tp_flags & f`` is non-zero.
|
|
|
|
.. c:macro:: Py_TPFLAGS_HEAPTYPE
|
|
|
|
This bit is set when the type object itself is allocated on the heap, for
|
|
example, types created dynamically using :c:func:`PyType_FromSpec`. In this
|
|
case, the :c:member:`~PyObject.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). Heap types should also :ref:`support garbage collection <supporting-cycle-detection>`
|
|
as they can form a reference cycle with their own module object.
|
|
|
|
**Inheritance:**
|
|
|
|
???
|
|
|
|
|
|
.. c:macro:: 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).
|
|
|
|
**Inheritance:**
|
|
|
|
???
|
|
|
|
|
|
.. c:macro:: Py_TPFLAGS_READY
|
|
|
|
This bit is set when the type object has been fully initialized by
|
|
:c:func:`PyType_Ready`.
|
|
|
|
**Inheritance:**
|
|
|
|
???
|
|
|
|
|
|
.. c:macro:: Py_TPFLAGS_READYING
|
|
|
|
This bit is set while :c:func:`PyType_Ready` is in the process of initializing
|
|
the type object.
|
|
|
|
**Inheritance:**
|
|
|
|
???
|
|
|
|
|
|
.. c:macro:: Py_TPFLAGS_HAVE_GC
|
|
|
|
This bit is set when the object supports garbage collection. If this bit
|
|
is set, memory for new instances (see :c:member:`~PyTypeObject.tp_alloc`)
|
|
must be allocated using :c:macro:`PyObject_GC_New` or
|
|
:c:func:`PyType_GenericAlloc` and deallocated (see
|
|
:c:member:`~PyTypeObject.tp_free`) using :c:func:`PyObject_GC_Del`. More
|
|
information in section :ref:`supporting-cycle-detection`.
|
|
|
|
**Inheritance:**
|
|
|
|
Group: :c:macro:`Py_TPFLAGS_HAVE_GC`, :c:member:`~PyTypeObject.tp_traverse`, :c:member:`~PyTypeObject.tp_clear`
|
|
|
|
The :c:macro:`Py_TPFLAGS_HAVE_GC` flag bit is inherited
|
|
together with the :c:member:`~PyTypeObject.tp_traverse` and :c:member:`~PyTypeObject.tp_clear`
|
|
fields, i.e. if the :c:macro:`Py_TPFLAGS_HAVE_GC` flag bit is
|
|
clear in the subtype and the :c:member:`~PyTypeObject.tp_traverse` and
|
|
:c:member:`~PyTypeObject.tp_clear` fields in the subtype exist and have ``NULL``
|
|
values.
|
|
|
|
|
|
.. c:macro:: 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: :c:macro:`Py_TPFLAGS_HAVE_STACKLESS_EXTENSION`.
|
|
|
|
**Inheritance:**
|
|
|
|
???
|
|
|
|
|
|
.. c:macro:: Py_TPFLAGS_METHOD_DESCRIPTOR
|
|
|
|
This bit indicates that objects behave like unbound methods.
|
|
|
|
If this flag is set for ``type(meth)``, then:
|
|
|
|
- ``meth.__get__(obj, cls)(*args, **kwds)`` (with ``obj`` not None)
|
|
must be equivalent to ``meth(obj, *args, **kwds)``.
|
|
|
|
- ``meth.__get__(None, cls)(*args, **kwds)``
|
|
must be equivalent to ``meth(*args, **kwds)``.
|
|
|
|
This flag enables an optimization for typical method calls like
|
|
``obj.meth()``: it avoids creating a temporary "bound method" object for
|
|
``obj.meth``.
|
|
|
|
.. versionadded:: 3.8
|
|
|
|
**Inheritance:**
|
|
|
|
This flag is never inherited by types without the
|
|
:c:macro:`Py_TPFLAGS_IMMUTABLETYPE` flag set. For extension types, it is
|
|
inherited whenever :c:member:`~PyTypeObject.tp_descr_get` is inherited.
|
|
|
|
.. c:macro:: Py_TPFLAGS_MANAGED_DICT
|
|
|
|
This bit indicates that instances of the class have a `~object.__dict__`
|
|
attribute, and that the space for the dictionary is managed by the VM.
|
|
|
|
If this flag is set, :c:macro:`Py_TPFLAGS_HAVE_GC` should also be set.
|
|
|
|
The type traverse function must call :c:func:`PyObject_VisitManagedDict`
|
|
and its clear function must call :c:func:`PyObject_ClearManagedDict`.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
**Inheritance:**
|
|
|
|
This flag is inherited unless the
|
|
:c:member:`~PyTypeObject.tp_dictoffset` field is set in a superclass.
|
|
|
|
|
|
.. c:macro:: Py_TPFLAGS_MANAGED_WEAKREF
|
|
|
|
This bit indicates that instances of the class should be weakly
|
|
referenceable.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
**Inheritance:**
|
|
|
|
This flag is inherited unless the
|
|
:c:member:`~PyTypeObject.tp_weaklistoffset` field is set in a superclass.
|
|
|
|
|
|
.. c:macro:: Py_TPFLAGS_ITEMS_AT_END
|
|
|
|
Only usable with variable-size types, i.e. ones with non-zero
|
|
:c:member:`~PyTypeObject.tp_itemsize`.
|
|
|
|
Indicates that the variable-sized portion of an instance of this type is
|
|
at the end of the instance's memory area, at an offset of
|
|
``Py_TYPE(obj)->tp_basicsize`` (which may be different in each
|
|
subclass).
|
|
|
|
When setting this flag, be sure that all superclasses either
|
|
use this memory layout, or are not variable-sized.
|
|
Python does not check this.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
**Inheritance:**
|
|
|
|
This flag is inherited.
|
|
|
|
.. XXX Document more flags here?
|
|
|
|
|
|
.. c:macro:: Py_TPFLAGS_LONG_SUBCLASS
|
|
.. c:macro:: Py_TPFLAGS_LIST_SUBCLASS
|
|
.. c:macro:: Py_TPFLAGS_TUPLE_SUBCLASS
|
|
.. c:macro:: Py_TPFLAGS_BYTES_SUBCLASS
|
|
.. c:macro:: Py_TPFLAGS_UNICODE_SUBCLASS
|
|
.. c:macro:: Py_TPFLAGS_DICT_SUBCLASS
|
|
.. c:macro:: Py_TPFLAGS_BASE_EXC_SUBCLASS
|
|
.. c:macro:: Py_TPFLAGS_TYPE_SUBCLASS
|
|
|
|
These flags are used by functions such as
|
|
:c:func:`PyLong_Check` to quickly determine if a type is a subclass
|
|
of a built-in type; such specific checks are faster than a generic
|
|
check, like :c:func:`PyObject_IsInstance`. Custom types that inherit
|
|
from built-ins should have their :c:member:`~PyTypeObject.tp_flags`
|
|
set appropriately, or the code that interacts with such types
|
|
will behave differently depending on what kind of check is used.
|
|
|
|
|
|
.. c:macro:: Py_TPFLAGS_HAVE_FINALIZE
|
|
|
|
This bit is set when the :c:member:`~PyTypeObject.tp_finalize` slot is present in the
|
|
type structure.
|
|
|
|
.. versionadded:: 3.4
|
|
|
|
.. deprecated:: 3.8
|
|
This flag isn't necessary anymore, as the interpreter assumes the
|
|
:c:member:`~PyTypeObject.tp_finalize` slot is always present in the
|
|
type structure.
|
|
|
|
|
|
.. c:macro:: Py_TPFLAGS_HAVE_VECTORCALL
|
|
|
|
This bit is set when the class implements
|
|
the :ref:`vectorcall protocol <vectorcall>`.
|
|
See :c:member:`~PyTypeObject.tp_vectorcall_offset` for details.
|
|
|
|
**Inheritance:**
|
|
|
|
This bit is inherited if :c:member:`~PyTypeObject.tp_call` is also
|
|
inherited.
|
|
|
|
.. versionadded:: 3.9
|
|
|
|
.. versionchanged:: 3.12
|
|
|
|
This flag is now removed from a class when the class's
|
|
:py:meth:`~object.__call__` method is reassigned.
|
|
|
|
This flag can now be inherited by mutable classes.
|
|
|
|
.. c:macro:: Py_TPFLAGS_IMMUTABLETYPE
|
|
|
|
This bit is set for type objects that are immutable: type attributes cannot be set nor deleted.
|
|
|
|
:c:func:`PyType_Ready` automatically applies this flag to
|
|
:ref:`static types <static-types>`.
|
|
|
|
**Inheritance:**
|
|
|
|
This flag is not inherited.
|
|
|
|
.. versionadded:: 3.10
|
|
|
|
.. c:macro:: Py_TPFLAGS_DISALLOW_INSTANTIATION
|
|
|
|
Disallow creating instances of the type: set
|
|
:c:member:`~PyTypeObject.tp_new` to NULL and don't create the ``__new__``
|
|
key in the type dictionary.
|
|
|
|
The flag must be set before creating the type, not after. For example, it
|
|
must be set before :c:func:`PyType_Ready` is called on the type.
|
|
|
|
The flag is set automatically on :ref:`static types <static-types>` if
|
|
:c:member:`~PyTypeObject.tp_base` is NULL or ``&PyBaseObject_Type`` and
|
|
:c:member:`~PyTypeObject.tp_new` is NULL.
|
|
|
|
**Inheritance:**
|
|
|
|
This flag is not inherited.
|
|
However, subclasses will not be instantiable unless they provide a
|
|
non-NULL :c:member:`~PyTypeObject.tp_new` (which is only possible
|
|
via the C API).
|
|
|
|
.. note::
|
|
|
|
To disallow instantiating a class directly but allow instantiating
|
|
its subclasses (e.g. for an :term:`abstract base class`),
|
|
do not use this flag.
|
|
Instead, make :c:member:`~PyTypeObject.tp_new` only succeed for
|
|
subclasses.
|
|
|
|
.. versionadded:: 3.10
|
|
|
|
|
|
.. c:macro:: Py_TPFLAGS_MAPPING
|
|
|
|
This bit indicates that instances of the class may match mapping patterns
|
|
when used as the subject of a :keyword:`match` block. It is automatically
|
|
set when registering or subclassing :class:`collections.abc.Mapping`, and
|
|
unset when registering :class:`collections.abc.Sequence`.
|
|
|
|
.. note::
|
|
|
|
:c:macro:`Py_TPFLAGS_MAPPING` and :c:macro:`Py_TPFLAGS_SEQUENCE` are
|
|
mutually exclusive; it is an error to enable both flags simultaneously.
|
|
|
|
**Inheritance:**
|
|
|
|
This flag is inherited by types that do not already set
|
|
:c:macro:`Py_TPFLAGS_SEQUENCE`.
|
|
|
|
.. seealso:: :pep:`634` -- Structural Pattern Matching: Specification
|
|
|
|
.. versionadded:: 3.10
|
|
|
|
|
|
.. c:macro:: Py_TPFLAGS_SEQUENCE
|
|
|
|
This bit indicates that instances of the class may match sequence patterns
|
|
when used as the subject of a :keyword:`match` block. It is automatically
|
|
set when registering or subclassing :class:`collections.abc.Sequence`, and
|
|
unset when registering :class:`collections.abc.Mapping`.
|
|
|
|
.. note::
|
|
|
|
:c:macro:`Py_TPFLAGS_MAPPING` and :c:macro:`Py_TPFLAGS_SEQUENCE` are
|
|
mutually exclusive; it is an error to enable both flags simultaneously.
|
|
|
|
**Inheritance:**
|
|
|
|
This flag is inherited by types that do not already set
|
|
:c:macro:`Py_TPFLAGS_MAPPING`.
|
|
|
|
.. seealso:: :pep:`634` -- Structural Pattern Matching: Specification
|
|
|
|
.. versionadded:: 3.10
|
|
|
|
|
|
.. c:macro:: Py_TPFLAGS_VALID_VERSION_TAG
|
|
|
|
Internal. Do not set or unset this flag.
|
|
To indicate that a class has changed call :c:func:`PyType_Modified`
|
|
|
|
.. warning::
|
|
This flag is present in header files, but is not be used.
|
|
It will be removed in a future version of CPython
|
|
|
|
|
|
.. c:member:: const char* PyTypeObject.tp_doc
|
|
|
|
An optional pointer to a NUL-terminated C string giving the docstring for this
|
|
type object. This is exposed as the :attr:`~type.__doc__` attribute on the
|
|
type and instances of the type.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is *not* inherited by subtypes.
|
|
|
|
|
|
.. c:member:: traverseproc PyTypeObject.tp_traverse
|
|
|
|
An optional pointer to a traversal function for the garbage collector. This is
|
|
only used if the :c:macro:`Py_TPFLAGS_HAVE_GC` flag bit is set. The signature is::
|
|
|
|
int tp_traverse(PyObject *self, visitproc visit, void *arg);
|
|
|
|
More information about Python's garbage collection scheme can be found
|
|
in section :ref:`supporting-cycle-detection`.
|
|
|
|
The :c:member:`~PyTypeObject.tp_traverse` pointer is used by the garbage collector to detect
|
|
reference cycles. A typical implementation of a :c:member:`~PyTypeObject.tp_traverse` function
|
|
simply calls :c:func:`Py_VISIT` on each of the instance's members that are Python
|
|
objects that the instance owns. For example, this is function :c:func:`!local_traverse` from the
|
|
:mod:`!_thread` extension module::
|
|
|
|
static int
|
|
local_traverse(PyObject *op, visitproc visit, void *arg)
|
|
{
|
|
localobject *self = (localobject *) op;
|
|
Py_VISIT(self->args);
|
|
Py_VISIT(self->kw);
|
|
Py_VISIT(self->dict);
|
|
return 0;
|
|
}
|
|
|
|
Note that :c:func:`Py_VISIT` is called only on those members that can participate
|
|
in reference cycles. Although there is also a ``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 :mod:`gc` module's
|
|
:func:`~gc.get_referents` function will include it.
|
|
|
|
Heap types (:c:macro:`Py_TPFLAGS_HEAPTYPE`) must visit their type with::
|
|
|
|
Py_VISIT(Py_TYPE(self));
|
|
|
|
It is only needed since Python 3.9. To support Python 3.8 and older, this
|
|
line must be conditional::
|
|
|
|
#if PY_VERSION_HEX >= 0x03090000
|
|
Py_VISIT(Py_TYPE(self));
|
|
#endif
|
|
|
|
If the :c:macro:`Py_TPFLAGS_MANAGED_DICT` bit is set in the
|
|
:c:member:`~PyTypeObject.tp_flags` field, the traverse function must call
|
|
:c:func:`PyObject_VisitManagedDict` like this::
|
|
|
|
PyObject_VisitManagedDict((PyObject*)self, visit, arg);
|
|
|
|
.. warning::
|
|
When implementing :c:member:`~PyTypeObject.tp_traverse`, only the
|
|
members that the instance *owns* (by having :term:`strong references
|
|
<strong reference>` to them) must be
|
|
visited. For instance, if an object supports weak references via the
|
|
:c:member:`~PyTypeObject.tp_weaklist` slot, the pointer supporting
|
|
the linked list (what *tp_weaklist* points to) must **not** be
|
|
visited as the instance does not directly own the weak references to itself
|
|
(the weakreference list is there to support the weak reference machinery,
|
|
but the instance has no strong reference to the elements inside it, as they
|
|
are allowed to be removed even if the instance is still alive).
|
|
|
|
Note that :c:func:`Py_VISIT` requires the *visit* and *arg* parameters to
|
|
:c:func:`!local_traverse` to have these specific names; don't name them just
|
|
anything.
|
|
|
|
Instances of :ref:`heap-allocated types <heap-types>` hold a reference to
|
|
their type. Their traversal function must therefore either visit
|
|
:c:func:`Py_TYPE(self) <Py_TYPE>`, or delegate this responsibility by
|
|
calling ``tp_traverse`` of another heap-allocated type (such as a
|
|
heap-allocated superclass).
|
|
If they do not, the type object may not be garbage-collected.
|
|
|
|
.. note::
|
|
|
|
The :c:member:`~PyTypeObject.tp_traverse` function can be called from any
|
|
thread.
|
|
|
|
.. versionchanged:: 3.9
|
|
|
|
Heap-allocated types are expected to visit ``Py_TYPE(self)`` in
|
|
``tp_traverse``. In earlier versions of Python, due to
|
|
`bug 40217 <https://bugs.python.org/issue40217>`_, doing this
|
|
may lead to crashes in subclasses.
|
|
|
|
**Inheritance:**
|
|
|
|
Group: :c:macro:`Py_TPFLAGS_HAVE_GC`, :c:member:`~PyTypeObject.tp_traverse`, :c:member:`~PyTypeObject.tp_clear`
|
|
|
|
This field is inherited by subtypes together with :c:member:`~PyTypeObject.tp_clear` and the
|
|
:c:macro:`Py_TPFLAGS_HAVE_GC` flag bit: the flag bit, :c:member:`~PyTypeObject.tp_traverse`, and
|
|
:c:member:`~PyTypeObject.tp_clear` are all inherited from the base type if they are all zero in
|
|
the subtype.
|
|
|
|
|
|
.. c:member:: inquiry PyTypeObject.tp_clear
|
|
|
|
An optional pointer to a clear function. The signature is::
|
|
|
|
int tp_clear(PyObject *);
|
|
|
|
The purpose of this function is to break reference cycles that are causing a
|
|
:term:`cyclic isolate` so that the objects can be safely destroyed. A
|
|
cleared object is a partially destroyed object; the object is not obligated
|
|
to satisfy design invariants held during normal use.
|
|
|
|
:c:member:`!tp_clear` does not need to delete references to objects that
|
|
can't participate in reference cycles, such as Python strings or Python
|
|
integers. However, it may be convenient to clear all references, and write
|
|
the type's :c:member:`~PyTypeObject.tp_dealloc` function to invoke
|
|
:c:member:`!tp_clear` to avoid code duplication. (Beware that
|
|
:c:member:`!tp_clear` might have already been called. Prefer calling
|
|
idempotent functions like :c:func:`Py_CLEAR`.)
|
|
|
|
Any non-trivial cleanup should be performed in
|
|
:c:member:`~PyTypeObject.tp_finalize` instead of :c:member:`!tp_clear`.
|
|
|
|
.. note::
|
|
|
|
If :c:member:`!tp_clear` fails to break a reference cycle then the
|
|
objects in the :term:`cyclic isolate` may remain indefinitely
|
|
uncollectable ("leak"). See :data:`gc.garbage`.
|
|
|
|
.. note::
|
|
|
|
Referents (direct and indirect) might have already been cleared; they are
|
|
not guaranteed to be in a consistent state.
|
|
|
|
.. note::
|
|
|
|
The :c:member:`~PyTypeObject.tp_clear` function can be called from any
|
|
thread.
|
|
|
|
.. note::
|
|
|
|
An object is not guaranteed to be automatically cleared before its
|
|
destructor (:c:member:`~PyTypeObject.tp_dealloc`) is called.
|
|
|
|
This function differs from the destructor
|
|
(:c:member:`~PyTypeObject.tp_dealloc`) in the following ways:
|
|
|
|
* The purpose of clearing an object is to remove references to other objects
|
|
that might participate in a reference cycle. The purpose of the
|
|
destructor, on the other hand, is a superset: it must release *all*
|
|
resources it owns, including references to objects that cannot participate
|
|
in a reference cycle (e.g., integers) as well as the object's own memory
|
|
(by calling :c:member:`~PyTypeObject.tp_free`).
|
|
* When :c:member:`!tp_clear` is called, other objects might still hold
|
|
references to the object being cleared. Because of this,
|
|
:c:member:`!tp_clear` must not deallocate the object's own memory
|
|
(:c:member:`~PyTypeObject.tp_free`). The destructor, on the other hand,
|
|
is only called when no (strong) references exist, and as such, must
|
|
safely destroy the object itself by deallocating it.
|
|
* :c:member:`!tp_clear` might never be automatically called. An object's
|
|
destructor, on the other hand, will be automatically called some time
|
|
after the object becomes unreachable (i.e., either there are no references
|
|
to the object or the object is a member of a :term:`cyclic isolate`).
|
|
|
|
No guarantees are made about when, if, or how often Python automatically
|
|
clears an object, except:
|
|
|
|
* Python will not automatically clear an object if it is reachable, i.e.,
|
|
there is a reference to it and it is not a member of a :term:`cyclic
|
|
isolate`.
|
|
* Python will not automatically clear an object if it has not been
|
|
automatically finalized (see :c:member:`~PyTypeObject.tp_finalize`). (If
|
|
the finalizer resurrected the object, the object may or may not be
|
|
automatically finalized again before it is cleared.)
|
|
* If an object is a member of a :term:`cyclic isolate`, Python will not
|
|
automatically clear it if any member of the cyclic isolate has not yet
|
|
been automatically finalized (:c:member:`~PyTypeObject.tp_finalize`).
|
|
* Python will not destroy an object until after any automatic calls to its
|
|
:c:member:`!tp_clear` function have returned. This ensures that the act
|
|
of breaking a reference cycle does not invalidate the ``self`` pointer
|
|
while :c:member:`!tp_clear` is still executing.
|
|
* Python will not automatically call :c:member:`!tp_clear` multiple times
|
|
concurrently.
|
|
|
|
CPython currently only automatically clears objects as needed to break
|
|
reference cycles in a :term:`cyclic isolate`, but future versions might
|
|
clear objects regularly before their destruction.
|
|
|
|
Taken together, all :c:member:`~PyTypeObject.tp_clear` functions in the
|
|
system must combine to break all reference cycles. This is subtle, and if
|
|
in any doubt supply a :c:member:`~PyTypeObject.tp_clear` function. For
|
|
example, the tuple type does not implement a
|
|
:c:member:`~PyTypeObject.tp_clear` function, because it's possible to prove
|
|
that no reference cycle can be composed entirely of tuples. Therefore the
|
|
:c:member:`~PyTypeObject.tp_clear` functions of other types are responsible
|
|
for breaking any cycle containing a tuple. This isn't immediately obvious,
|
|
and there's rarely a good reason to avoid implementing
|
|
:c:member:`~PyTypeObject.tp_clear`.
|
|
|
|
Implementations of :c:member:`~PyTypeObject.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::
|
|
|
|
static int
|
|
local_clear(PyObject *op)
|
|
{
|
|
localobject *self = (localobject *) op;
|
|
Py_CLEAR(self->key);
|
|
Py_CLEAR(self->args);
|
|
Py_CLEAR(self->kw);
|
|
Py_CLEAR(self->dict);
|
|
return 0;
|
|
}
|
|
|
|
The :c:func:`Py_CLEAR` macro should be used, because clearing references is
|
|
delicate: the reference to the contained object must not be released
|
|
(via :c:func:`Py_DECREF`) until
|
|
after the pointer to the contained object is set to ``NULL``. This is because
|
|
releasing the reference 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 *self* again,
|
|
it's important that the pointer to the contained object be ``NULL`` at that time,
|
|
so that *self* knows the contained object can no longer be used. The
|
|
:c:func:`Py_CLEAR` macro performs the operations in a safe order.
|
|
|
|
If the :c:macro:`Py_TPFLAGS_MANAGED_DICT` bit is set in the
|
|
:c:member:`~PyTypeObject.tp_flags` field, the traverse function must call
|
|
:c:func:`PyObject_ClearManagedDict` like this::
|
|
|
|
PyObject_ClearManagedDict((PyObject*)self);
|
|
|
|
More information about Python's garbage collection scheme can be found in
|
|
section :ref:`supporting-cycle-detection`.
|
|
|
|
**Inheritance:**
|
|
|
|
Group: :c:macro:`Py_TPFLAGS_HAVE_GC`, :c:member:`~PyTypeObject.tp_traverse`, :c:member:`~PyTypeObject.tp_clear`
|
|
|
|
This field is inherited by subtypes together with :c:member:`~PyTypeObject.tp_traverse` and the
|
|
:c:macro:`Py_TPFLAGS_HAVE_GC` flag bit: the flag bit, :c:member:`~PyTypeObject.tp_traverse`, and
|
|
:c:member:`~PyTypeObject.tp_clear` are all inherited from the base type if they are all zero in
|
|
the subtype.
|
|
|
|
.. seealso::
|
|
|
|
:ref:`life-cycle` for details about how this slot relates to other slots.
|
|
|
|
|
|
.. c:member:: richcmpfunc PyTypeObject.tp_richcompare
|
|
|
|
An optional pointer to the rich comparison function, whose signature is::
|
|
|
|
PyObject *tp_richcompare(PyObject *self, PyObject *other, int op);
|
|
|
|
The first parameter is guaranteed to be an instance of the type
|
|
that is defined by :c:type:`PyTypeObject`.
|
|
|
|
The function should return the result of the comparison (usually ``Py_True``
|
|
or ``Py_False``). If the comparison is undefined, it must return
|
|
``Py_NotImplemented``, if another error occurred it must return ``NULL`` and
|
|
set an exception condition.
|
|
|
|
The following constants are defined to be used as the third argument for
|
|
:c:member:`~PyTypeObject.tp_richcompare` and for :c:func:`PyObject_RichCompare`:
|
|
|
|
.. c:namespace:: NULL
|
|
|
|
+--------------------+------------+
|
|
| Constant | Comparison |
|
|
+====================+============+
|
|
| .. c:macro:: Py_LT | ``<`` |
|
|
+--------------------+------------+
|
|
| .. c:macro:: Py_LE | ``<=`` |
|
|
+--------------------+------------+
|
|
| .. c:macro:: Py_EQ | ``==`` |
|
|
+--------------------+------------+
|
|
| .. c:macro:: Py_NE | ``!=`` |
|
|
+--------------------+------------+
|
|
| .. c:macro:: Py_GT | ``>`` |
|
|
+--------------------+------------+
|
|
| .. c:macro:: Py_GE | ``>=`` |
|
|
+--------------------+------------+
|
|
|
|
The following macro is defined to ease writing rich comparison functions:
|
|
|
|
.. c:macro:: Py_RETURN_RICHCOMPARE(VAL_A, VAL_B, op)
|
|
|
|
Return ``Py_True`` or ``Py_False`` from the function, depending on the
|
|
result of a comparison.
|
|
VAL_A and VAL_B must be orderable by C comparison operators (for example,
|
|
they may be C ints or floats). The third argument specifies the requested
|
|
operation, as for :c:func:`PyObject_RichCompare`.
|
|
|
|
The returned value is a new :term:`strong reference`.
|
|
|
|
On error, sets an exception and returns ``NULL`` from the function.
|
|
|
|
.. versionadded:: 3.7
|
|
|
|
**Inheritance:**
|
|
|
|
Group: :c:member:`~PyTypeObject.tp_hash`, :c:member:`~PyTypeObject.tp_richcompare`
|
|
|
|
This field is inherited by subtypes together with :c:member:`~PyTypeObject.tp_hash`:
|
|
a subtype inherits :c:member:`~PyTypeObject.tp_richcompare` and :c:member:`~PyTypeObject.tp_hash` when
|
|
the subtype's :c:member:`~PyTypeObject.tp_richcompare` and :c:member:`~PyTypeObject.tp_hash` are both
|
|
``NULL``.
|
|
|
|
**Default:**
|
|
|
|
:c:data:`PyBaseObject_Type` provides a :c:member:`~PyTypeObject.tp_richcompare`
|
|
implementation, which may be inherited. However, if only
|
|
:c:member:`~PyTypeObject.tp_hash` is defined, not even the inherited function is used
|
|
and instances of the type will not be able to participate in any
|
|
comparisons.
|
|
|
|
|
|
.. c:member:: Py_ssize_t PyTypeObject.tp_weaklistoffset
|
|
|
|
While this field is still supported, :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF`
|
|
should be used instead, if at all possible.
|
|
|
|
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
|
|
:c:func:`PyObject_ClearWeakRefs` and the ``PyWeakref_*`` functions. The
|
|
instance structure needs to include a field of type :c:expr:`PyObject*` which is
|
|
initialized to ``NULL``.
|
|
|
|
Do not confuse this field with :c:member:`~PyTypeObject.tp_weaklist`; that is the list head for
|
|
weak references to the type object itself.
|
|
|
|
It is an error to set both the :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` bit and
|
|
:c:member:`~PyTypeObject.tp_weaklistoffset`.
|
|
|
|
**Inheritance:**
|
|
|
|
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
|
|
:c:member:`~PyTypeObject.tp_weaklistoffset`, this should not be a problem.
|
|
|
|
**Default:**
|
|
|
|
If the :c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` bit is set in the
|
|
:c:member:`~PyTypeObject.tp_flags` field, then
|
|
:c:member:`~PyTypeObject.tp_weaklistoffset` will be set to a negative value,
|
|
to indicate that it is unsafe to use this field.
|
|
|
|
|
|
.. c:member:: getiterfunc PyTypeObject.tp_iter
|
|
|
|
An optional pointer to a function that returns an :term:`iterator` for the
|
|
object. Its presence normally signals that the instances of this type are
|
|
:term:`iterable` (although sequences may be iterable without this function).
|
|
|
|
This function has the same signature as :c:func:`PyObject_GetIter`::
|
|
|
|
PyObject *tp_iter(PyObject *self);
|
|
|
|
**Inheritance:**
|
|
|
|
This field is inherited by subtypes.
|
|
|
|
|
|
.. c:member:: iternextfunc PyTypeObject.tp_iternext
|
|
|
|
An optional pointer to a function that returns the next item in an
|
|
:term:`iterator`. The signature is::
|
|
|
|
PyObject *tp_iternext(PyObject *self);
|
|
|
|
When the iterator is exhausted, it must return ``NULL``; a :exc:`StopIteration`
|
|
exception may or may not be set. When another error occurs, it must return
|
|
``NULL`` too. Its presence signals that the instances of this type are
|
|
iterators.
|
|
|
|
Iterator types should also define the :c:member:`~PyTypeObject.tp_iter` function, and that
|
|
function should return the iterator instance itself (not a new iterator
|
|
instance).
|
|
|
|
This function has the same signature as :c:func:`PyIter_Next`.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is inherited by subtypes.
|
|
|
|
|
|
.. c:member:: struct PyMethodDef* PyTypeObject.tp_methods
|
|
|
|
An optional pointer to a static ``NULL``-terminated array of :c:type:`PyMethodDef`
|
|
structures, declaring regular methods of this type.
|
|
|
|
For each entry in the array, an entry is added to the type's dictionary (see
|
|
:c:member:`~PyTypeObject.tp_dict` below) containing a method descriptor.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is not inherited by subtypes (methods are inherited through a
|
|
different mechanism).
|
|
|
|
|
|
.. c:member:: struct PyMemberDef* PyTypeObject.tp_members
|
|
|
|
An optional pointer to a static ``NULL``-terminated array of :c:type:`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
|
|
:c:member:`~PyTypeObject.tp_dict` below) containing a member descriptor.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is not inherited by subtypes (members are inherited through a
|
|
different mechanism).
|
|
|
|
|
|
.. c:member:: struct PyGetSetDef* PyTypeObject.tp_getset
|
|
|
|
An optional pointer to a static ``NULL``-terminated array of :c:type:`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
|
|
:c:member:`~PyTypeObject.tp_dict` below) containing a getset descriptor.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is not inherited by subtypes (computed attributes are inherited
|
|
through a different mechanism).
|
|
|
|
|
|
.. c:member:: 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.
|
|
|
|
.. note::
|
|
|
|
.. from Modules/xxmodule.c
|
|
|
|
Slot initialization is subject to the rules of initializing globals.
|
|
C99 requires the initializers to be "address constants". Function
|
|
designators like :c:func:`PyType_GenericNew`, with implicit conversion
|
|
to a pointer, are valid C99 address constants.
|
|
|
|
However, the unary '&' operator applied to a non-static variable
|
|
like :c:data:`PyBaseObject_Type` is not required to produce an address
|
|
constant. Compilers may support this (gcc does), MSVC does not.
|
|
Both compilers are strictly standard conforming in this particular
|
|
behavior.
|
|
|
|
Consequently, :c:member:`~PyTypeObject.tp_base` should be set in
|
|
the extension module's init function.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is not inherited by subtypes (obviously).
|
|
|
|
**Default:**
|
|
|
|
This field defaults to ``&PyBaseObject_Type`` (which to Python
|
|
programmers is known as the type :class:`object`).
|
|
|
|
|
|
.. c:member:: PyObject* PyTypeObject.tp_dict
|
|
|
|
The type's dictionary is stored here by :c:func:`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 :c:func:`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 :meth:`~object.__add__`). Once
|
|
initialization for the type has finished, this field should be
|
|
treated as read-only.
|
|
|
|
Some types may not store their dictionary in this slot.
|
|
Use :c:func:`PyType_GetDict` to retrieve the dictionary for an arbitrary
|
|
type.
|
|
|
|
.. versionchanged:: 3.12
|
|
|
|
Internals detail: For static builtin types, this is always ``NULL``.
|
|
Instead, the dict for such types is stored on ``PyInterpreterState``.
|
|
Use :c:func:`PyType_GetDict` to get the dict for an arbitrary type.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is not inherited by subtypes (though the attributes defined in here
|
|
are inherited through a different mechanism).
|
|
|
|
**Default:**
|
|
|
|
If this field is ``NULL``, :c:func:`PyType_Ready` will assign a new
|
|
dictionary to it.
|
|
|
|
.. warning::
|
|
|
|
It is not safe to use :c:func:`PyDict_SetItem` on or otherwise modify
|
|
:c:member:`~PyTypeObject.tp_dict` with the dictionary C-API.
|
|
|
|
|
|
.. c:member:: descrgetfunc PyTypeObject.tp_descr_get
|
|
|
|
An optional pointer to a "descriptor get" function.
|
|
|
|
The function signature is::
|
|
|
|
PyObject * tp_descr_get(PyObject *self, PyObject *obj, PyObject *type);
|
|
|
|
.. XXX explain more?
|
|
|
|
**Inheritance:**
|
|
|
|
This field is inherited by subtypes.
|
|
|
|
|
|
.. c:member:: descrsetfunc PyTypeObject.tp_descr_set
|
|
|
|
An optional pointer to a function for setting and deleting
|
|
a descriptor's value.
|
|
|
|
The function signature is::
|
|
|
|
int tp_descr_set(PyObject *self, PyObject *obj, PyObject *value);
|
|
|
|
The *value* argument is set to ``NULL`` to delete the value.
|
|
|
|
.. XXX explain more?
|
|
|
|
**Inheritance:**
|
|
|
|
This field is inherited by subtypes.
|
|
|
|
|
|
.. c:member:: Py_ssize_t PyTypeObject.tp_dictoffset
|
|
|
|
While this field is still supported, :c:macro:`Py_TPFLAGS_MANAGED_DICT` should be
|
|
used instead, if at all possible.
|
|
|
|
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
|
|
:c:func:`PyObject_GenericGetAttr`.
|
|
|
|
Do not confuse this field with :c:member:`~PyTypeObject.tp_dict`; that is the dictionary for
|
|
attributes of the type object itself.
|
|
|
|
The value specifies the offset of the dictionary from the start of the instance structure.
|
|
|
|
The :c:member:`~PyTypeObject.tp_dictoffset` should be regarded as write-only.
|
|
To get the pointer to the dictionary call :c:func:`PyObject_GenericGetDict`.
|
|
Calling :c:func:`PyObject_GenericGetDict` may need to allocate memory for the
|
|
dictionary, so it is may be more efficient to call :c:func:`PyObject_GetAttr`
|
|
when accessing an attribute on the object.
|
|
|
|
It is an error to set both the :c:macro:`Py_TPFLAGS_MANAGED_DICT` bit and
|
|
:c:member:`~PyTypeObject.tp_dictoffset`.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is inherited by subtypes. A subtype should not override this offset;
|
|
doing so could be unsafe, if C code tries to access the dictionary at the
|
|
previous offset.
|
|
To properly support inheritance, use :c:macro:`Py_TPFLAGS_MANAGED_DICT`.
|
|
|
|
**Default:**
|
|
|
|
This slot has no default. For :ref:`static types <static-types>`, if the
|
|
field is ``NULL`` then no :attr:`~object.__dict__` gets created for instances.
|
|
|
|
If the :c:macro:`Py_TPFLAGS_MANAGED_DICT` bit is set in the
|
|
:c:member:`~PyTypeObject.tp_flags` field, then
|
|
:c:member:`~PyTypeObject.tp_dictoffset` will be set to ``-1``, to indicate
|
|
that it is unsafe to use this field.
|
|
|
|
|
|
.. c:member:: initproc PyTypeObject.tp_init
|
|
|
|
An optional pointer to an instance initialization function.
|
|
|
|
This function corresponds to the :meth:`~object.__init__` method of classes. Like
|
|
:meth:`!__init__`, it is possible to create an instance without calling
|
|
:meth:`!__init__`, and it is possible to reinitialize an instance by calling its
|
|
:meth:`!__init__` method again.
|
|
|
|
The function signature is::
|
|
|
|
int tp_init(PyObject *self, PyObject *args, PyObject *kwds);
|
|
|
|
The self argument is the instance to be initialized; the *args* and *kwds*
|
|
arguments represent positional and keyword arguments of the call to
|
|
:meth:`~object.__init__`.
|
|
|
|
The :c:member:`~PyTypeObject.tp_init` function, if not ``NULL``, is called when an instance is
|
|
created normally by calling its type, after the type's :c:member:`~PyTypeObject.tp_new` function
|
|
has returned an instance of the type. If the :c:member:`~PyTypeObject.tp_new` function returns an
|
|
instance of some other type that is not a subtype of the original type, no
|
|
:c:member:`~PyTypeObject.tp_init` function is called; if :c:member:`~PyTypeObject.tp_new` returns an instance of a
|
|
subtype of the original type, the subtype's :c:member:`~PyTypeObject.tp_init` is called.
|
|
|
|
Returns ``0`` on success, ``-1`` and sets an exception on error.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is inherited by subtypes.
|
|
|
|
**Default:**
|
|
|
|
For :ref:`static types <static-types>` this field does not have a default.
|
|
|
|
|
|
.. c:member:: allocfunc PyTypeObject.tp_alloc
|
|
|
|
An optional pointer to an instance allocation function.
|
|
|
|
The function signature is::
|
|
|
|
PyObject *tp_alloc(PyTypeObject *self, Py_ssize_t nitems);
|
|
|
|
**Inheritance:**
|
|
|
|
Static subtypes inherit this slot, which will be
|
|
:c:func:`PyType_GenericAlloc` if inherited from :class:`object`.
|
|
|
|
:ref:`Heap subtypes <heap-types>` do not inherit this slot.
|
|
|
|
**Default:**
|
|
|
|
For heap subtypes, this field is always set to
|
|
:c:func:`PyType_GenericAlloc`.
|
|
|
|
For static subtypes, this slot is inherited (see above).
|
|
|
|
|
|
.. c:member:: newfunc PyTypeObject.tp_new
|
|
|
|
An optional pointer to an instance creation function.
|
|
|
|
The function signature is::
|
|
|
|
PyObject *tp_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds);
|
|
|
|
The *subtype* argument is the type of the object being created; the *args* and
|
|
*kwds* arguments represent positional and keyword arguments of the call to the
|
|
type. Note that *subtype* doesn't have to equal the type whose :c:member:`~PyTypeObject.tp_new`
|
|
function is called; it may be a subtype of that type (but not an unrelated
|
|
type).
|
|
|
|
The :c:member:`~PyTypeObject.tp_new` function should call ``subtype->tp_alloc(subtype, 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 :c:member:`~PyTypeObject.tp_init` handler. A good
|
|
rule of thumb is that for immutable types, all initialization should take place
|
|
in :c:member:`~PyTypeObject.tp_new`, while for mutable types, most initialization should be
|
|
deferred to :c:member:`~PyTypeObject.tp_init`.
|
|
|
|
Set the :c:macro:`Py_TPFLAGS_DISALLOW_INSTANTIATION` flag to disallow creating
|
|
instances of the type in Python.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is inherited by subtypes, except it is not inherited by
|
|
:ref:`static types <static-types>` whose :c:member:`~PyTypeObject.tp_base`
|
|
is ``NULL`` or ``&PyBaseObject_Type``.
|
|
|
|
**Default:**
|
|
|
|
For :ref:`static types <static-types>` this field has no default.
|
|
This means if the slot is defined as ``NULL``, the type cannot be called
|
|
to create new instances; presumably there is some other way to create
|
|
instances, like a factory function.
|
|
|
|
|
|
.. c:member:: freefunc PyTypeObject.tp_free
|
|
|
|
An optional pointer to an instance deallocation function. Its signature is::
|
|
|
|
void tp_free(void *self);
|
|
|
|
This function must free the memory allocated by
|
|
:c:member:`~PyTypeObject.tp_alloc`.
|
|
|
|
**Inheritance:**
|
|
|
|
Static subtypes inherit this slot, which will be :c:func:`PyObject_Free` if
|
|
inherited from :class:`object`. Exception: If the type supports garbage
|
|
collection (i.e., the :c:macro:`Py_TPFLAGS_HAVE_GC` flag is set in
|
|
:c:member:`~PyTypeObject.tp_flags`) and it would inherit
|
|
:c:func:`PyObject_Free`, then this slot is not inherited but instead defaults
|
|
to :c:func:`PyObject_GC_Del`.
|
|
|
|
:ref:`Heap subtypes <heap-types>` do not inherit this slot.
|
|
|
|
**Default:**
|
|
|
|
For :ref:`heap subtypes <heap-types>`, this slot defaults to a deallocator suitable to match
|
|
:c:func:`PyType_GenericAlloc` and the value of the
|
|
:c:macro:`Py_TPFLAGS_HAVE_GC` flag.
|
|
|
|
For static subtypes, this slot is inherited (see above).
|
|
|
|
|
|
.. c:member:: inquiry PyTypeObject.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
|
|
:c:member:`~PyTypeObject.tp_flags` field, and check the :c:macro:`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 ``1`` for a collectible instance, and
|
|
``0`` for a non-collectible instance. The signature is::
|
|
|
|
int tp_is_gc(PyObject *self);
|
|
|
|
(The only example of this are types themselves. The metatype,
|
|
:c:data:`PyType_Type`, defines this function to distinguish between statically
|
|
and :ref:`dynamically allocated types <heap-types>`.)
|
|
|
|
**Inheritance:**
|
|
|
|
This field is inherited by subtypes.
|
|
|
|
**Default:**
|
|
|
|
This slot has no default. If this field is ``NULL``,
|
|
:c:macro:`Py_TPFLAGS_HAVE_GC` is used as the functional equivalent.
|
|
|
|
|
|
.. c:member:: PyObject* PyTypeObject.tp_bases
|
|
|
|
Tuple of base types.
|
|
|
|
This field should be set to ``NULL`` and treated as read-only.
|
|
Python will fill it in when the type is :c:func:`initialized <PyType_Ready>`.
|
|
|
|
For dynamically created classes, the ``Py_tp_bases``
|
|
:c:type:`slot <PyType_Slot>` can be used instead of the *bases* argument
|
|
of :c:func:`PyType_FromSpecWithBases`.
|
|
The argument form is preferred.
|
|
|
|
.. warning::
|
|
|
|
Multiple inheritance does not work well for statically defined types.
|
|
If you set ``tp_bases`` to a tuple, Python will not raise an error,
|
|
but some slots will only be inherited from the first base.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is not inherited.
|
|
|
|
|
|
.. c:member:: PyObject* PyTypeObject.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 should be set to ``NULL`` and treated as read-only.
|
|
Python will fill it in when the type is :c:func:`initialized <PyType_Ready>`.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is not inherited; it is calculated fresh by
|
|
:c:func:`PyType_Ready`.
|
|
|
|
|
|
.. c:member:: PyObject* PyTypeObject.tp_cache
|
|
|
|
Unused. Internal use only.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is not inherited.
|
|
|
|
|
|
.. c:member:: void* PyTypeObject.tp_subclasses
|
|
|
|
A collection of subclasses. Internal use only. May be an invalid pointer.
|
|
|
|
To get a list of subclasses, call the Python method
|
|
:py:meth:`~type.__subclasses__`.
|
|
|
|
.. versionchanged:: 3.12
|
|
|
|
For some types, this field does not hold a valid :c:expr:`PyObject*`.
|
|
The type was changed to :c:expr:`void*` to indicate this.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is not inherited.
|
|
|
|
|
|
.. c:member:: PyObject* PyTypeObject.tp_weaklist
|
|
|
|
Weak reference list head, for weak references to this type object. Not
|
|
inherited. Internal use only.
|
|
|
|
.. versionchanged:: 3.12
|
|
|
|
Internals detail: For the static builtin types this is always ``NULL``,
|
|
even if weakrefs are added. Instead, the weakrefs for each are stored
|
|
on ``PyInterpreterState``. Use the public C-API or the internal
|
|
``_PyObject_GET_WEAKREFS_LISTPTR()`` macro to avoid the distinction.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is not inherited.
|
|
|
|
|
|
.. c:member:: destructor PyTypeObject.tp_del
|
|
|
|
This field is deprecated. Use :c:member:`~PyTypeObject.tp_finalize` instead.
|
|
|
|
|
|
.. c:member:: unsigned int PyTypeObject.tp_version_tag
|
|
|
|
Used to index into the method cache. Internal use only.
|
|
|
|
**Inheritance:**
|
|
|
|
This field is not inherited.
|
|
|
|
|
|
.. c:member:: destructor PyTypeObject.tp_finalize
|
|
|
|
An optional pointer to an instance finalization function. This is the C
|
|
implementation of the :meth:`~object.__del__` special method. Its signature
|
|
is::
|
|
|
|
void tp_finalize(PyObject *self);
|
|
|
|
The primary purpose of finalization is to perform any non-trivial cleanup
|
|
that must be performed before the object is destroyed, while the object and
|
|
any other objects it directly or indirectly references are still in a
|
|
consistent state. The finalizer is allowed to execute
|
|
arbitrary Python code.
|
|
|
|
Before Python automatically finalizes an object, some of the object's direct
|
|
or indirect referents might have themselves been automatically finalized.
|
|
However, none of the referents will have been automatically cleared
|
|
(:c:member:`~PyTypeObject.tp_clear`) yet.
|
|
|
|
Other non-finalized objects might still be using a finalized object, so the
|
|
finalizer must leave the object in a sane state (e.g., invariants are still
|
|
met).
|
|
|
|
.. note::
|
|
|
|
After Python automatically finalizes an object, Python might start
|
|
automatically clearing (:c:member:`~PyTypeObject.tp_clear`) the object
|
|
and its referents (direct and indirect). Cleared objects are not
|
|
guaranteed to be in a consistent state; a finalized object must be able
|
|
to tolerate cleared referents.
|
|
|
|
.. note::
|
|
|
|
An object is not guaranteed to be automatically finalized before its
|
|
destructor (:c:member:`~PyTypeObject.tp_dealloc`) is called. It is
|
|
recommended to call :c:func:`PyObject_CallFinalizerFromDealloc` at the
|
|
beginning of :c:member:`!tp_dealloc` to guarantee that the object is
|
|
always finalized before destruction.
|
|
|
|
.. note::
|
|
|
|
The :c:member:`~PyTypeObject.tp_finalize` function can be called from any
|
|
thread, although the :term:`GIL` will be held.
|
|
|
|
.. note::
|
|
|
|
The :c:member:`!tp_finalize` function can be called during shutdown,
|
|
after some global variables have been deleted. See the documentation of
|
|
the :meth:`~object.__del__` method for details.
|
|
|
|
When Python finalizes an object, it behaves like the following algorithm:
|
|
|
|
#. Python might mark the object as *finalized*. Currently, Python always
|
|
marks objects whose type supports garbage collection (i.e., the
|
|
:c:macro:`Py_TPFLAGS_HAVE_GC` flag is set in
|
|
:c:member:`~PyTypeObject.tp_flags`) and never marks other types of
|
|
objects; this might change in a future version.
|
|
#. If the object is not marked as *finalized* and its
|
|
:c:member:`!tp_finalize` finalizer function is non-``NULL``, the
|
|
finalizer function is called.
|
|
#. If the finalizer function was called and the finalizer made the object
|
|
reachable (i.e., there is a reference to the object and it is not a
|
|
member of a :term:`cyclic isolate`), then the finalizer is said to have
|
|
*resurrected* the object. It is unspecified whether the finalizer can
|
|
also resurrect the object by adding a new reference to the object that
|
|
does not make it reachable, i.e., the object is (still) a member of a
|
|
cyclic isolate.
|
|
#. If the finalizer resurrected the object, the object's pending destruction
|
|
is canceled and the object's *finalized* mark might be removed if
|
|
present. Currently, Python never removes the *finalized* mark; this
|
|
might change in a future version.
|
|
|
|
*Automatic finalization* refers to any finalization performed by Python
|
|
except via calls to :c:func:`PyObject_CallFinalizer` or
|
|
:c:func:`PyObject_CallFinalizerFromDealloc`. No guarantees are made about
|
|
when, if, or how often an object is automatically finalized, except:
|
|
|
|
* Python will not automatically finalize an object if it is reachable, i.e.,
|
|
there is a reference to it and it is not a member of a :term:`cyclic
|
|
isolate`.
|
|
* Python will not automatically finalize an object if finalizing it would
|
|
not mark the object as *finalized*. Currently, this applies to objects
|
|
whose type does not support garbage collection, i.e., the
|
|
:c:macro:`Py_TPFLAGS_HAVE_GC` flag is not set. Such objects can still be
|
|
manually finalized by calling :c:func:`PyObject_CallFinalizer` or
|
|
:c:func:`PyObject_CallFinalizerFromDealloc`.
|
|
* Python will not automatically finalize any two members of a :term:`cyclic
|
|
isolate` concurrently.
|
|
* Python will not automatically finalize an object after it has
|
|
automatically cleared (:c:member:`~PyTypeObject.tp_clear`) the object.
|
|
* If an object is a member of a :term:`cyclic isolate`, Python will not
|
|
automatically finalize it after automatically clearing (see
|
|
:c:member:`~PyTypeObject.tp_clear`) any other member.
|
|
* Python will automatically finalize every member of a :term:`cyclic
|
|
isolate` before it automatically clears (see
|
|
:c:member:`~PyTypeObject.tp_clear`) any of them.
|
|
* If Python is going to automatically clear an object
|
|
(:c:member:`~PyTypeObject.tp_clear`), it will automatically finalize the
|
|
object first.
|
|
|
|
Python currently only automatically finalizes objects that are members of a
|
|
:term:`cyclic isolate`, but future versions might finalize objects regularly
|
|
before their destruction.
|
|
|
|
To manually finalize an object, do not call this function directly; call
|
|
:c:func:`PyObject_CallFinalizer` or
|
|
:c:func:`PyObject_CallFinalizerFromDealloc` instead.
|
|
|
|
:c:member:`~PyTypeObject.tp_finalize` should leave the current exception
|
|
status unchanged. The recommended way to write a non-trivial finalizer is
|
|
to back up the exception at the beginning by calling
|
|
:c:func:`PyErr_GetRaisedException` and restore the exception at the end by
|
|
calling :c:func:`PyErr_SetRaisedException`. If an exception is encountered
|
|
in the middle of the finalizer, log and clear it with
|
|
:c:func:`PyErr_WriteUnraisable` or :c:func:`PyErr_FormatUnraisable`. For
|
|
example::
|
|
|
|
static void
|
|
foo_finalize(PyObject *self)
|
|
{
|
|
// Save the current exception, if any.
|
|
PyObject *exc = PyErr_GetRaisedException();
|
|
|
|
// ...
|
|
|
|
if (do_something_that_might_raise() != success_indicator) {
|
|
PyErr_WriteUnraisable(self);
|
|
goto done;
|
|
}
|
|
|
|
done:
|
|
// Restore the saved exception. This silently discards any exception
|
|
// raised above, so be sure to call PyErr_WriteUnraisable first if
|
|
// necessary.
|
|
PyErr_SetRaisedException(exc);
|
|
}
|
|
|
|
**Inheritance:**
|
|
|
|
This field is inherited by subtypes.
|
|
|
|
.. versionadded:: 3.4
|
|
|
|
.. versionchanged:: 3.8
|
|
|
|
Before version 3.8 it was necessary to set the
|
|
:c:macro:`Py_TPFLAGS_HAVE_FINALIZE` flags bit in order for this field to be
|
|
used. This is no longer required.
|
|
|
|
.. seealso::
|
|
|
|
* :pep:`442`: "Safe object finalization"
|
|
* :ref:`life-cycle` for details about how this slot relates to other
|
|
slots.
|
|
* :c:func:`PyObject_CallFinalizer`
|
|
* :c:func:`PyObject_CallFinalizerFromDealloc`
|
|
|
|
|
|
.. c:member:: vectorcallfunc PyTypeObject.tp_vectorcall
|
|
|
|
A :ref:`vectorcall function <vectorcall>` to use for calls of this type
|
|
object (rather than instances).
|
|
In other words, ``tp_vectorcall`` can be used to optimize ``type.__call__``,
|
|
which typically returns a new instance of *type*.
|
|
|
|
As with any vectorcall function, if ``tp_vectorcall`` is ``NULL``,
|
|
the *tp_call* protocol (``Py_TYPE(type)->tp_call``) is used instead.
|
|
|
|
.. note::
|
|
|
|
The :ref:`vectorcall protocol <vectorcall>` requires that the vectorcall
|
|
function has the same behavior as the corresponding ``tp_call``.
|
|
This means that ``type->tp_vectorcall`` must match the behavior of
|
|
``Py_TYPE(type)->tp_call``.
|
|
|
|
Specifically, if *type* uses the default metaclass,
|
|
``type->tp_vectorcall`` must behave the same as
|
|
:c:expr:`PyType_Type->tp_call`, which:
|
|
|
|
- calls ``type->tp_new``,
|
|
|
|
- if the result is a subclass of *type*, calls ``type->tp_init``
|
|
on the result of ``tp_new``, and
|
|
|
|
- returns the result of ``tp_new``.
|
|
|
|
Typically, ``tp_vectorcall`` is overridden to optimize this process
|
|
for specific :c:member:`~PyTypeObject.tp_new` and
|
|
:c:member:`~PyTypeObject.tp_init`.
|
|
When doing this for user-subclassable types, note that both can be
|
|
overridden (using :py:func:`~object.__new__` and
|
|
:py:func:`~object.__init__`, respectively).
|
|
|
|
|
|
|
|
**Inheritance:**
|
|
|
|
This field is never inherited.
|
|
|
|
.. versionadded:: 3.9 (the field exists since 3.8 but it's only used since 3.9)
|
|
|
|
|
|
.. c:member:: unsigned char PyTypeObject.tp_watched
|
|
|
|
Internal. Do not use.
|
|
|
|
.. versionadded:: 3.12
|
|
|
|
|
|
.. _static-types:
|
|
|
|
Static Types
|
|
------------
|
|
|
|
Traditionally, types defined in C code are *static*, that is,
|
|
a static :c:type:`PyTypeObject` structure is defined directly in code
|
|
and initialized using :c:func:`PyType_Ready`.
|
|
|
|
This results in types that are limited relative to types defined in Python:
|
|
|
|
* Static types are limited to one base, i.e. they cannot use multiple
|
|
inheritance.
|
|
* Static type objects (but not necessarily their instances) are immutable.
|
|
It is not possible to add or modify the type object's attributes from Python.
|
|
* Static type objects are shared across
|
|
:ref:`sub-interpreters <sub-interpreter-support>`, so they should not
|
|
include any subinterpreter-specific state.
|
|
|
|
Also, since :c:type:`PyTypeObject` is only part of the :ref:`Limited API
|
|
<limited-c-api>` as an opaque struct, any extension modules using static types must be
|
|
compiled for a specific Python minor version.
|
|
|
|
|
|
.. _heap-types:
|
|
|
|
Heap Types
|
|
----------
|
|
|
|
An alternative to :ref:`static types <static-types>` is *heap-allocated types*,
|
|
or *heap types* for short, which correspond closely to classes created by
|
|
Python's ``class`` statement. Heap types have the :c:macro:`Py_TPFLAGS_HEAPTYPE`
|
|
flag set.
|
|
|
|
This is done by filling a :c:type:`PyType_Spec` structure and calling
|
|
:c:func:`PyType_FromSpec`, :c:func:`PyType_FromSpecWithBases`,
|
|
:c:func:`PyType_FromModuleAndSpec`, or :c:func:`PyType_FromMetaclass`.
|
|
|
|
|
|
.. _number-structs:
|
|
|
|
Number Object Structures
|
|
------------------------
|
|
|
|
.. sectionauthor:: Amaury Forgeot d'Arc
|
|
|
|
|
|
.. c:type:: PyNumberMethods
|
|
|
|
This structure holds pointers to the functions which an object uses to
|
|
implement the number protocol. Each function is used by the function of
|
|
similar name documented in the :ref:`number` section.
|
|
|
|
.. XXX Drop the definition?
|
|
|
|
Here is the structure definition::
|
|
|
|
typedef struct {
|
|
binaryfunc nb_add;
|
|
binaryfunc nb_subtract;
|
|
binaryfunc nb_multiply;
|
|
binaryfunc nb_remainder;
|
|
binaryfunc nb_divmod;
|
|
ternaryfunc nb_power;
|
|
unaryfunc nb_negative;
|
|
unaryfunc nb_positive;
|
|
unaryfunc nb_absolute;
|
|
inquiry nb_bool;
|
|
unaryfunc nb_invert;
|
|
binaryfunc nb_lshift;
|
|
binaryfunc nb_rshift;
|
|
binaryfunc nb_and;
|
|
binaryfunc nb_xor;
|
|
binaryfunc nb_or;
|
|
unaryfunc nb_int;
|
|
void *nb_reserved;
|
|
unaryfunc nb_float;
|
|
|
|
binaryfunc nb_inplace_add;
|
|
binaryfunc nb_inplace_subtract;
|
|
binaryfunc nb_inplace_multiply;
|
|
binaryfunc nb_inplace_remainder;
|
|
ternaryfunc nb_inplace_power;
|
|
binaryfunc nb_inplace_lshift;
|
|
binaryfunc nb_inplace_rshift;
|
|
binaryfunc nb_inplace_and;
|
|
binaryfunc nb_inplace_xor;
|
|
binaryfunc nb_inplace_or;
|
|
|
|
binaryfunc nb_floor_divide;
|
|
binaryfunc nb_true_divide;
|
|
binaryfunc nb_inplace_floor_divide;
|
|
binaryfunc nb_inplace_true_divide;
|
|
|
|
unaryfunc nb_index;
|
|
|
|
binaryfunc nb_matrix_multiply;
|
|
binaryfunc nb_inplace_matrix_multiply;
|
|
} PyNumberMethods;
|
|
|
|
.. note::
|
|
|
|
Binary and ternary functions must check the type of all their operands,
|
|
and implement the necessary conversions (at least one of the operands is
|
|
an instance of the defined type). If the operation is not defined for the
|
|
given operands, binary and ternary functions must return
|
|
``Py_NotImplemented``, if another error occurred they must return ``NULL``
|
|
and set an exception.
|
|
|
|
.. note::
|
|
|
|
The :c:member:`~PyNumberMethods.nb_reserved` field should always be ``NULL``. It
|
|
was previously called :c:member:`!nb_long`, and was renamed in
|
|
Python 3.0.1.
|
|
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_add
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_subtract
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_multiply
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_remainder
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_divmod
|
|
.. c:member:: ternaryfunc PyNumberMethods.nb_power
|
|
.. c:member:: unaryfunc PyNumberMethods.nb_negative
|
|
.. c:member:: unaryfunc PyNumberMethods.nb_positive
|
|
.. c:member:: unaryfunc PyNumberMethods.nb_absolute
|
|
.. c:member:: inquiry PyNumberMethods.nb_bool
|
|
.. c:member:: unaryfunc PyNumberMethods.nb_invert
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_lshift
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_rshift
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_and
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_xor
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_or
|
|
.. c:member:: unaryfunc PyNumberMethods.nb_int
|
|
.. c:member:: void *PyNumberMethods.nb_reserved
|
|
.. c:member:: unaryfunc PyNumberMethods.nb_float
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_inplace_add
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_inplace_subtract
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_inplace_multiply
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_inplace_remainder
|
|
.. c:member:: ternaryfunc PyNumberMethods.nb_inplace_power
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_inplace_lshift
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_inplace_rshift
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_inplace_and
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_inplace_xor
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_inplace_or
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_floor_divide
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_true_divide
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_inplace_floor_divide
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_inplace_true_divide
|
|
.. c:member:: unaryfunc PyNumberMethods.nb_index
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_matrix_multiply
|
|
.. c:member:: binaryfunc PyNumberMethods.nb_inplace_matrix_multiply
|
|
|
|
|
|
.. _mapping-structs:
|
|
|
|
Mapping Object Structures
|
|
-------------------------
|
|
|
|
.. sectionauthor:: Amaury Forgeot d'Arc
|
|
|
|
|
|
.. c:type:: PyMappingMethods
|
|
|
|
This structure holds pointers to the functions which an object uses to
|
|
implement the mapping protocol. It has three members:
|
|
|
|
.. c:member:: lenfunc PyMappingMethods.mp_length
|
|
|
|
This function is used by :c:func:`PyMapping_Size` and
|
|
:c:func:`PyObject_Size`, and has the same signature. This slot may be set to
|
|
``NULL`` if the object has no defined length.
|
|
|
|
.. c:member:: binaryfunc PyMappingMethods.mp_subscript
|
|
|
|
This function is used by :c:func:`PyObject_GetItem` and
|
|
:c:func:`PySequence_GetSlice`, and has the same signature as
|
|
:c:func:`!PyObject_GetItem`. This slot must be filled for the
|
|
:c:func:`PyMapping_Check` function to return ``1``, it can be ``NULL``
|
|
otherwise.
|
|
|
|
.. c:member:: objobjargproc PyMappingMethods.mp_ass_subscript
|
|
|
|
This function is used by :c:func:`PyObject_SetItem`,
|
|
:c:func:`PyObject_DelItem`, :c:func:`PySequence_SetSlice` and
|
|
:c:func:`PySequence_DelSlice`. It has the same signature as
|
|
:c:func:`!PyObject_SetItem`, but *v* can also be set to ``NULL`` to delete
|
|
an item. If this slot is ``NULL``, the object does not support item
|
|
assignment and deletion.
|
|
|
|
|
|
.. _sequence-structs:
|
|
|
|
Sequence Object Structures
|
|
--------------------------
|
|
|
|
.. sectionauthor:: Amaury Forgeot d'Arc
|
|
|
|
|
|
.. c:type:: PySequenceMethods
|
|
|
|
This structure holds pointers to the functions which an object uses to
|
|
implement the sequence protocol.
|
|
|
|
.. c:member:: lenfunc PySequenceMethods.sq_length
|
|
|
|
This function is used by :c:func:`PySequence_Size` and
|
|
:c:func:`PyObject_Size`, and has the same signature. It is also used for
|
|
handling negative indices via the :c:member:`~PySequenceMethods.sq_item`
|
|
and the :c:member:`~PySequenceMethods.sq_ass_item` slots.
|
|
|
|
.. c:member:: binaryfunc PySequenceMethods.sq_concat
|
|
|
|
This function is used by :c:func:`PySequence_Concat` and has the same
|
|
signature. It is also used by the ``+`` operator, after trying the numeric
|
|
addition via the :c:member:`~PyNumberMethods.nb_add` slot.
|
|
|
|
.. c:member:: ssizeargfunc PySequenceMethods.sq_repeat
|
|
|
|
This function is used by :c:func:`PySequence_Repeat` and has the same
|
|
signature. It is also used by the ``*`` operator, after trying numeric
|
|
multiplication via the :c:member:`~PyNumberMethods.nb_multiply` slot.
|
|
|
|
.. c:member:: ssizeargfunc PySequenceMethods.sq_item
|
|
|
|
This function is used by :c:func:`PySequence_GetItem` and has the same
|
|
signature. It is also used by :c:func:`PyObject_GetItem`, after trying
|
|
the subscription via the :c:member:`~PyMappingMethods.mp_subscript` slot.
|
|
This slot must be filled for the :c:func:`PySequence_Check`
|
|
function to return ``1``, it can be ``NULL`` otherwise.
|
|
|
|
Negative indexes are handled as follows: if the :c:member:`~PySequenceMethods.sq_length` slot is
|
|
filled, it is called and the sequence length is used to compute a positive
|
|
index which is passed to :c:member:`~PySequenceMethods.sq_item`. If :c:member:`!sq_length` is ``NULL``,
|
|
the index is passed as is to the function.
|
|
|
|
.. c:member:: ssizeobjargproc PySequenceMethods.sq_ass_item
|
|
|
|
This function is used by :c:func:`PySequence_SetItem` and has the same
|
|
signature. It is also used by :c:func:`PyObject_SetItem` and
|
|
:c:func:`PyObject_DelItem`, after trying the item assignment and deletion
|
|
via the :c:member:`~PyMappingMethods.mp_ass_subscript` slot.
|
|
This slot may be left to ``NULL`` if the object does not support
|
|
item assignment and deletion.
|
|
|
|
.. c:member:: objobjproc PySequenceMethods.sq_contains
|
|
|
|
This function may be used by :c:func:`PySequence_Contains` and has the same
|
|
signature. This slot may be left to ``NULL``, in this case
|
|
:c:func:`!PySequence_Contains` simply traverses the sequence until it
|
|
finds a match.
|
|
|
|
.. c:member:: binaryfunc PySequenceMethods.sq_inplace_concat
|
|
|
|
This function is used by :c:func:`PySequence_InPlaceConcat` and has the same
|
|
signature. It should modify its first operand, and return it. This slot
|
|
may be left to ``NULL``, in this case :c:func:`!PySequence_InPlaceConcat`
|
|
will fall back to :c:func:`PySequence_Concat`. It is also used by the
|
|
augmented assignment ``+=``, after trying numeric in-place addition
|
|
via the :c:member:`~PyNumberMethods.nb_inplace_add` slot.
|
|
|
|
.. c:member:: ssizeargfunc PySequenceMethods.sq_inplace_repeat
|
|
|
|
This function is used by :c:func:`PySequence_InPlaceRepeat` and has the same
|
|
signature. It should modify its first operand, and return it. This slot
|
|
may be left to ``NULL``, in this case :c:func:`!PySequence_InPlaceRepeat`
|
|
will fall back to :c:func:`PySequence_Repeat`. It is also used by the
|
|
augmented assignment ``*=``, after trying numeric in-place multiplication
|
|
via the :c:member:`~PyNumberMethods.nb_inplace_multiply` slot.
|
|
|
|
|
|
.. _buffer-structs:
|
|
|
|
Buffer Object Structures
|
|
------------------------
|
|
|
|
.. sectionauthor:: Greg J. Stein <greg@lyra.org>
|
|
.. sectionauthor:: Benjamin Peterson
|
|
.. sectionauthor:: Stefan Krah
|
|
|
|
.. c:type:: PyBufferProcs
|
|
|
|
This structure holds pointers to the functions required by the
|
|
:ref:`Buffer protocol <bufferobjects>`. The protocol defines how
|
|
an exporter object can expose its internal data to consumer objects.
|
|
|
|
.. c:member:: getbufferproc PyBufferProcs.bf_getbuffer
|
|
|
|
The signature of this function is::
|
|
|
|
int (PyObject *exporter, Py_buffer *view, int flags);
|
|
|
|
Handle a request to *exporter* to fill in *view* as specified by *flags*.
|
|
Except for point (3), an implementation of this function MUST take these
|
|
steps:
|
|
|
|
(1) Check if the request can be met. If not, raise :exc:`BufferError`,
|
|
set :c:expr:`view->obj` to ``NULL`` and return ``-1``.
|
|
|
|
(2) Fill in the requested fields.
|
|
|
|
(3) Increment an internal counter for the number of exports.
|
|
|
|
(4) Set :c:expr:`view->obj` to *exporter* and increment :c:expr:`view->obj`.
|
|
|
|
(5) Return ``0``.
|
|
|
|
If *exporter* is part of a chain or tree of buffer providers, two main
|
|
schemes can be used:
|
|
|
|
* Re-export: Each member of the tree acts as the exporting object and
|
|
sets :c:expr:`view->obj` to a new reference to itself.
|
|
|
|
* Redirect: The buffer request is redirected to the root object of the
|
|
tree. Here, :c:expr:`view->obj` will be a new reference to the root
|
|
object.
|
|
|
|
The individual fields of *view* are described in section
|
|
:ref:`Buffer structure <buffer-structure>`, the rules how an exporter
|
|
must react to specific requests are in section
|
|
:ref:`Buffer request types <buffer-request-types>`.
|
|
|
|
All memory pointed to in the :c:type:`Py_buffer` structure belongs to
|
|
the exporter and must remain valid until there are no consumers left.
|
|
:c:member:`~Py_buffer.format`, :c:member:`~Py_buffer.shape`,
|
|
:c:member:`~Py_buffer.strides`, :c:member:`~Py_buffer.suboffsets`
|
|
and :c:member:`~Py_buffer.internal`
|
|
are read-only for the consumer.
|
|
|
|
:c:func:`PyBuffer_FillInfo` provides an easy way of exposing a simple
|
|
bytes buffer while dealing correctly with all request types.
|
|
|
|
:c:func:`PyObject_GetBuffer` is the interface for the consumer that
|
|
wraps this function.
|
|
|
|
.. c:member:: releasebufferproc PyBufferProcs.bf_releasebuffer
|
|
|
|
The signature of this function is::
|
|
|
|
void (PyObject *exporter, Py_buffer *view);
|
|
|
|
Handle a request to release the resources of the buffer. If no resources
|
|
need to be released, :c:member:`PyBufferProcs.bf_releasebuffer` may be
|
|
``NULL``. Otherwise, a standard implementation of this function will take
|
|
these optional steps:
|
|
|
|
(1) Decrement an internal counter for the number of exports.
|
|
|
|
(2) If the counter is ``0``, free all memory associated with *view*.
|
|
|
|
The exporter MUST use the :c:member:`~Py_buffer.internal` field to keep
|
|
track of buffer-specific resources. This field is guaranteed to remain
|
|
constant, while a consumer MAY pass a copy of the original buffer as the
|
|
*view* argument.
|
|
|
|
|
|
This function MUST NOT decrement :c:expr:`view->obj`, since that is
|
|
done automatically in :c:func:`PyBuffer_Release` (this scheme is
|
|
useful for breaking reference cycles).
|
|
|
|
|
|
:c:func:`PyBuffer_Release` is the interface for the consumer that
|
|
wraps this function.
|
|
|
|
|
|
.. _async-structs:
|
|
|
|
|
|
Async Object Structures
|
|
-----------------------
|
|
|
|
.. sectionauthor:: Yury Selivanov <yselivanov@sprymix.com>
|
|
|
|
.. versionadded:: 3.5
|
|
|
|
.. c:type:: PyAsyncMethods
|
|
|
|
This structure holds pointers to the functions required to implement
|
|
:term:`awaitable` and :term:`asynchronous iterator` objects.
|
|
|
|
Here is the structure definition::
|
|
|
|
typedef struct {
|
|
unaryfunc am_await;
|
|
unaryfunc am_aiter;
|
|
unaryfunc am_anext;
|
|
sendfunc am_send;
|
|
} PyAsyncMethods;
|
|
|
|
.. c:member:: unaryfunc PyAsyncMethods.am_await
|
|
|
|
The signature of this function is::
|
|
|
|
PyObject *am_await(PyObject *self);
|
|
|
|
The returned object must be an :term:`iterator`, i.e. :c:func:`PyIter_Check`
|
|
must return ``1`` for it.
|
|
|
|
This slot may be set to ``NULL`` if an object is not an :term:`awaitable`.
|
|
|
|
.. c:member:: unaryfunc PyAsyncMethods.am_aiter
|
|
|
|
The signature of this function is::
|
|
|
|
PyObject *am_aiter(PyObject *self);
|
|
|
|
Must return an :term:`asynchronous iterator` object.
|
|
See :meth:`~object.__anext__` for details.
|
|
|
|
This slot may be set to ``NULL`` if an object does not implement
|
|
asynchronous iteration protocol.
|
|
|
|
.. c:member:: unaryfunc PyAsyncMethods.am_anext
|
|
|
|
The signature of this function is::
|
|
|
|
PyObject *am_anext(PyObject *self);
|
|
|
|
Must return an :term:`awaitable` object.
|
|
See :meth:`~object.__anext__` for details.
|
|
This slot may be set to ``NULL``.
|
|
|
|
.. c:member:: sendfunc PyAsyncMethods.am_send
|
|
|
|
The signature of this function is::
|
|
|
|
PySendResult am_send(PyObject *self, PyObject *arg, PyObject **result);
|
|
|
|
See :c:func:`PyIter_Send` for details.
|
|
This slot may be set to ``NULL``.
|
|
|
|
.. versionadded:: 3.10
|
|
|
|
|
|
.. _slot-typedefs:
|
|
|
|
Slot Type typedefs
|
|
------------------
|
|
|
|
.. c:type:: PyObject *(*allocfunc)(PyTypeObject *cls, Py_ssize_t nitems)
|
|
|
|
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
|
|
:c:member:`~PyObject.ob_refcnt` set to ``1`` and :c:member:`~PyObject.ob_type` set to the type argument. If
|
|
the type's :c:member:`~PyTypeObject.tp_itemsize` is non-zero, the object's :c:member:`~PyVarObject.ob_size` field
|
|
should be initialized to *nitems* and the length of the allocated memory block
|
|
should be ``tp_basicsize + nitems*tp_itemsize``, rounded up to a multiple of
|
|
``sizeof(void*)``; otherwise, *nitems* is not used and the length of the block
|
|
should be :c:member:`~PyTypeObject.tp_basicsize`.
|
|
|
|
This function should not do any other instance initialization, not even to
|
|
allocate additional memory; that should be done by :c:member:`~PyTypeObject.tp_new`.
|
|
|
|
.. c:type:: void (*destructor)(PyObject *)
|
|
|
|
.. c:type:: void (*freefunc)(void *)
|
|
|
|
See :c:member:`~PyTypeObject.tp_free`.
|
|
|
|
.. c:type:: PyObject *(*newfunc)(PyTypeObject *, PyObject *, PyObject *)
|
|
|
|
See :c:member:`~PyTypeObject.tp_new`.
|
|
|
|
.. c:type:: int (*initproc)(PyObject *, PyObject *, PyObject *)
|
|
|
|
See :c:member:`~PyTypeObject.tp_init`.
|
|
|
|
.. c:type:: PyObject *(*reprfunc)(PyObject *)
|
|
|
|
See :c:member:`~PyTypeObject.tp_repr`.
|
|
|
|
.. c:type:: PyObject *(*getattrfunc)(PyObject *self, char *attr)
|
|
|
|
Return the value of the named attribute for the object.
|
|
|
|
.. c:type:: int (*setattrfunc)(PyObject *self, char *attr, PyObject *value)
|
|
|
|
Set the value of the named attribute for the object.
|
|
The value argument is set to ``NULL`` to delete the attribute.
|
|
|
|
.. c:type:: PyObject *(*getattrofunc)(PyObject *self, PyObject *attr)
|
|
|
|
Return the value of the named attribute for the object.
|
|
|
|
See :c:member:`~PyTypeObject.tp_getattro`.
|
|
|
|
.. c:type:: int (*setattrofunc)(PyObject *self, PyObject *attr, PyObject *value)
|
|
|
|
Set the value of the named attribute for the object.
|
|
The value argument is set to ``NULL`` to delete the attribute.
|
|
|
|
See :c:member:`~PyTypeObject.tp_setattro`.
|
|
|
|
.. c:type:: PyObject *(*descrgetfunc)(PyObject *, PyObject *, PyObject *)
|
|
|
|
See :c:member:`~PyTypeObject.tp_descr_get`.
|
|
|
|
.. c:type:: int (*descrsetfunc)(PyObject *, PyObject *, PyObject *)
|
|
|
|
See :c:member:`~PyTypeObject.tp_descr_set`.
|
|
|
|
.. c:type:: Py_hash_t (*hashfunc)(PyObject *)
|
|
|
|
See :c:member:`~PyTypeObject.tp_hash`.
|
|
|
|
.. c:type:: PyObject *(*richcmpfunc)(PyObject *, PyObject *, int)
|
|
|
|
See :c:member:`~PyTypeObject.tp_richcompare`.
|
|
|
|
.. c:type:: PyObject *(*getiterfunc)(PyObject *)
|
|
|
|
See :c:member:`~PyTypeObject.tp_iter`.
|
|
|
|
.. c:type:: PyObject *(*iternextfunc)(PyObject *)
|
|
|
|
See :c:member:`~PyTypeObject.tp_iternext`.
|
|
|
|
.. c:type:: Py_ssize_t (*lenfunc)(PyObject *)
|
|
|
|
.. c:type:: int (*getbufferproc)(PyObject *, Py_buffer *, int)
|
|
|
|
.. c:type:: void (*releasebufferproc)(PyObject *, Py_buffer *)
|
|
|
|
.. c:type:: PyObject *(*unaryfunc)(PyObject *)
|
|
|
|
.. c:type:: PyObject *(*binaryfunc)(PyObject *, PyObject *)
|
|
|
|
.. c:type:: PySendResult (*sendfunc)(PyObject *, PyObject *, PyObject **)
|
|
|
|
See :c:member:`~PyAsyncMethods.am_send`.
|
|
|
|
.. c:type:: PyObject *(*ternaryfunc)(PyObject *, PyObject *, PyObject *)
|
|
|
|
.. c:type:: PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t)
|
|
|
|
.. c:type:: int (*ssizeobjargproc)(PyObject *, Py_ssize_t, PyObject *)
|
|
|
|
.. c:type:: int (*objobjproc)(PyObject *, PyObject *)
|
|
|
|
.. c:type:: int (*objobjargproc)(PyObject *, PyObject *, PyObject *)
|
|
|
|
|
|
.. _typedef-examples:
|
|
|
|
Examples
|
|
--------
|
|
|
|
The following are simple examples of Python type definitions. They
|
|
include common usage you may encounter. Some demonstrate tricky corner
|
|
cases. For more examples, practical info, and a tutorial, see
|
|
:ref:`defining-new-types` and :ref:`new-types-topics`.
|
|
|
|
A basic :ref:`static type <static-types>`::
|
|
|
|
typedef struct {
|
|
PyObject_HEAD
|
|
const char *data;
|
|
} MyObject;
|
|
|
|
static PyTypeObject MyObject_Type = {
|
|
PyVarObject_HEAD_INIT(NULL, 0)
|
|
.tp_name = "mymod.MyObject",
|
|
.tp_basicsize = sizeof(MyObject),
|
|
.tp_doc = PyDoc_STR("My objects"),
|
|
.tp_new = myobj_new,
|
|
.tp_dealloc = (destructor)myobj_dealloc,
|
|
.tp_repr = (reprfunc)myobj_repr,
|
|
};
|
|
|
|
You may also find older code (especially in the CPython code base)
|
|
with a more verbose initializer::
|
|
|
|
static PyTypeObject MyObject_Type = {
|
|
PyVarObject_HEAD_INIT(NULL, 0)
|
|
"mymod.MyObject", /* tp_name */
|
|
sizeof(MyObject), /* tp_basicsize */
|
|
0, /* tp_itemsize */
|
|
(destructor)myobj_dealloc, /* tp_dealloc */
|
|
0, /* tp_vectorcall_offset */
|
|
0, /* tp_getattr */
|
|
0, /* tp_setattr */
|
|
0, /* tp_as_async */
|
|
(reprfunc)myobj_repr, /* tp_repr */
|
|
0, /* tp_as_number */
|
|
0, /* tp_as_sequence */
|
|
0, /* tp_as_mapping */
|
|
0, /* tp_hash */
|
|
0, /* tp_call */
|
|
0, /* tp_str */
|
|
0, /* tp_getattro */
|
|
0, /* tp_setattro */
|
|
0, /* tp_as_buffer */
|
|
0, /* tp_flags */
|
|
PyDoc_STR("My objects"), /* tp_doc */
|
|
0, /* tp_traverse */
|
|
0, /* tp_clear */
|
|
0, /* tp_richcompare */
|
|
0, /* tp_weaklistoffset */
|
|
0, /* tp_iter */
|
|
0, /* tp_iternext */
|
|
0, /* tp_methods */
|
|
0, /* tp_members */
|
|
0, /* tp_getset */
|
|
0, /* tp_base */
|
|
0, /* tp_dict */
|
|
0, /* tp_descr_get */
|
|
0, /* tp_descr_set */
|
|
0, /* tp_dictoffset */
|
|
0, /* tp_init */
|
|
0, /* tp_alloc */
|
|
myobj_new, /* tp_new */
|
|
};
|
|
|
|
A type that supports weakrefs, instance dicts, and hashing::
|
|
|
|
typedef struct {
|
|
PyObject_HEAD
|
|
const char *data;
|
|
} MyObject;
|
|
|
|
static PyTypeObject MyObject_Type = {
|
|
PyVarObject_HEAD_INIT(NULL, 0)
|
|
.tp_name = "mymod.MyObject",
|
|
.tp_basicsize = sizeof(MyObject),
|
|
.tp_doc = PyDoc_STR("My objects"),
|
|
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
|
|
Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_MANAGED_DICT |
|
|
Py_TPFLAGS_MANAGED_WEAKREF,
|
|
.tp_new = myobj_new,
|
|
.tp_traverse = (traverseproc)myobj_traverse,
|
|
.tp_clear = (inquiry)myobj_clear,
|
|
.tp_alloc = PyType_GenericNew,
|
|
.tp_dealloc = (destructor)myobj_dealloc,
|
|
.tp_repr = (reprfunc)myobj_repr,
|
|
.tp_hash = (hashfunc)myobj_hash,
|
|
.tp_richcompare = PyBaseObject_Type.tp_richcompare,
|
|
};
|
|
|
|
A str subclass that cannot be subclassed and cannot be called
|
|
to create instances (e.g. uses a separate factory func) using
|
|
:c:macro:`Py_TPFLAGS_DISALLOW_INSTANTIATION` flag::
|
|
|
|
typedef struct {
|
|
PyUnicodeObject raw;
|
|
char *extra;
|
|
} MyStr;
|
|
|
|
static PyTypeObject MyStr_Type = {
|
|
PyVarObject_HEAD_INIT(NULL, 0)
|
|
.tp_name = "mymod.MyStr",
|
|
.tp_basicsize = sizeof(MyStr),
|
|
.tp_base = NULL, // set to &PyUnicode_Type in module init
|
|
.tp_doc = PyDoc_STR("my custom str"),
|
|
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
|
|
.tp_repr = (reprfunc)myobj_repr,
|
|
};
|
|
|
|
The simplest :ref:`static type <static-types>` with fixed-length instances::
|
|
|
|
typedef struct {
|
|
PyObject_HEAD
|
|
} MyObject;
|
|
|
|
static PyTypeObject MyObject_Type = {
|
|
PyVarObject_HEAD_INIT(NULL, 0)
|
|
.tp_name = "mymod.MyObject",
|
|
};
|
|
|
|
The simplest :ref:`static type <static-types>` with variable-length instances::
|
|
|
|
typedef struct {
|
|
PyObject_VAR_HEAD
|
|
const char *data[1];
|
|
} MyObject;
|
|
|
|
static PyTypeObject MyObject_Type = {
|
|
PyVarObject_HEAD_INIT(NULL, 0)
|
|
.tp_name = "mymod.MyObject",
|
|
.tp_basicsize = sizeof(MyObject) - sizeof(char *),
|
|
.tp_itemsize = sizeof(char *),
|
|
};
|