| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | .. highlightlang:: c
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. _type-structs:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Type Objects
 | 
					
						
							|  |  |  | ============
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Perhaps one of the most important structures of the Python object system is the
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | structure that defines a new type: the :c:type:`PyTypeObject` structure.  Type
 | 
					
						
							|  |  |  | objects can be handled using any of the :c:func:`PyObject_\*` or
 | 
					
						
							|  |  |  | :c:func:`PyType_\*` functions, but do not offer much that's interesting to most
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 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.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  | In addition to the following quick reference, the :ref:`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`      | Py_ssize_t                        |                   | X | X |   | X |
 | 
					
						
							|  |  |  |    +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
 | 
					
						
							|  |  |  |    | :c:member:`~PyTypeObject.tp_itemsize`       | Py_ssize_t                        |                   |   | X |   | X |
 | 
					
						
							|  |  |  |    +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
 | 
					
						
							|  |  |  |    | :c:member:`~PyTypeObject.tp_dealloc`        | :c:type:`destructor`              |                   | X | X |   | X |
 | 
					
						
							|  |  |  |    +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
 | 
					
						
							|  |  |  |    | (:c:member:`~PyTypeObject.tp_print`)        |                                                                       |
 | 
					
						
							|  |  |  |    +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
 | 
					
						
							|  |  |  |    | (: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` | 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`     | 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`]   | :c:type:`PyObject` *              | __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 |
 | 
					
						
							|  |  |  |    +---------------------------------------------+-----------------------------------+-------------------+---+---+---+---+
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If :const:`COUNT_ALLOCS` is defined then the following (internal-only)
 | 
					
						
							|  |  |  | fields exist as well:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * :c:member:`~PyTypeObject.tp_allocs`
 | 
					
						
							|  |  |  | * :c:member:`~PyTypeObject.tp_frees`
 | 
					
						
							|  |  |  | * :c:member:`~PyTypeObject.tp_maxalloc`
 | 
					
						
							|  |  |  | * :c:member:`~PyTypeObject.tp_prev`
 | 
					
						
							|  |  |  | * :c:member:`~PyTypeObject.tp_next`
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. [#slots]
 | 
					
						
							|  |  |  |    A slot name in parentheses indicates it is (effectively) deprecated.
 | 
					
						
							|  |  |  |    Names in angle brackets should be 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:type:`PyBaseObject_Type`
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    **"T"**:  set on :c:type:`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:`~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`              | __sub__      |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :c:member:`~PyNumberMethods.nb_multiply`                | :c:type:`binaryfunc`              | __mul__      |
 | 
					
						
							|  |  |  |    |                                                         |                                   | __rmul__     |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :c:member:`~PyNumberMethods.nb_inplace_multiply`        | :c:type:`binaryfunc`              | __mul__      |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :c:member:`~PyNumberMethods.nb_remainder`               | :c:type:`binaryfunc`              | __mod__      |
 | 
					
						
							|  |  |  |    |                                                         |                                   | __rmod__     |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :c:member:`~PyNumberMethods.nb_inplace_remainder`       | :c:type:`binaryfunc`              | __mod__      |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :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`             | __pow__      |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :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`              | __lshift__   |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :c:member:`~PyNumberMethods.nb_rshift`                  | :c:type:`binaryfunc`              | __rshift__   |
 | 
					
						
							|  |  |  |    |                                                         |                                   | __rrshift__  |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :c:member:`~PyNumberMethods.nb_inplace_rshift`          | :c:type:`binaryfunc`              | __rshift__   |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :c:member:`~PyNumberMethods.nb_and`                     | :c:type:`binaryfunc`              | __and__      |
 | 
					
						
							|  |  |  |    |                                                         |                                   | __rand__     |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :c:member:`~PyNumberMethods.nb_inplace_and`             | :c:type:`binaryfunc`              | __and__      |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :c:member:`~PyNumberMethods.nb_xor`                     | :c:type:`binaryfunc`              | __xor__      |
 | 
					
						
							|  |  |  |    |                                                         |                                   | __rxor__     |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :c:member:`~PyNumberMethods.nb_inplace_xor`             | :c:type:`binaryfunc`              | __xor__      |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :c:member:`~PyNumberMethods.nb_or`                      | :c:type:`binaryfunc`              | __or__       |
 | 
					
						
							|  |  |  |    |                                                         |                                   | __ror__      |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :c:member:`~PyNumberMethods.nb_inplace_or`              | :c:type:`binaryfunc`              | __or__       |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :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`              | __floordiv__ |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :c:member:`~PyNumberMethods.nb_true_divide`             | :c:type:`binaryfunc`              | __truediv__  |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :c:member:`~PyNumberMethods.nb_inplace_true_divide`     | :c:type:`binaryfunc`              | __truediv__  |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :c:member:`~PyNumberMethods.nb_index`                   | :c:type:`binaryfunc`              | __index__    |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :c:member:`~PyNumberMethods.nb_matrix_multiply`         | :c:type:`binaryfunc`              | __matmul__   |
 | 
					
						
							|  |  |  |    |                                                         |                                   | __rmatmul__  |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :c:member:`~PyNumberMethods.nb_inplace_matrix_multiply` | :c:type:`binaryfunc`              | __matmul__   |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    |                                                                                                            |
 | 
					
						
							|  |  |  |    +---------------------------------------------------------+-----------------------------------+--------------+
 | 
					
						
							|  |  |  |    | :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` * |                      |
 | 
					
						
							|  |  |  | |                             |    Py_ssize_t               |                      |
 | 
					
						
							|  |  |  | +-----------------------------+-----------------------------+----------------------+
 | 
					
						
							|  |  |  | | :c:type:`destructor`        | void *                      | void                 |
 | 
					
						
							|  |  |  | +-----------------------------+-----------------------------+----------------------+
 | 
					
						
							|  |  |  | | :c:type:`freefunc`          | void *                      | void                 |
 | 
					
						
							|  |  |  | +-----------------------------+-----------------------------+----------------------+
 | 
					
						
							|  |  |  | | :c:type:`traverseproc`      | .. line-block::             | int                  |
 | 
					
						
							|  |  |  | |                             |                             |                      |
 | 
					
						
							|  |  |  | |                             |    void *                   |                      |
 | 
					
						
							|  |  |  | |                             |    :c:type:`visitproc`      |                      |
 | 
					
						
							|  |  |  | |                             |    void *                   |                      |
 | 
					
						
							|  |  |  | +-----------------------------+-----------------------------+----------------------+
 | 
					
						
							|  |  |  | | :c:type:`newfunc`           | .. line-block::             | :c:type:`PyObject` * |
 | 
					
						
							|  |  |  | |                             |                             |                      |
 | 
					
						
							|  |  |  | |                             |    :c:type:`PyObject` *     |                      |
 | 
					
						
							|  |  |  | |                             |    :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:`printfunc`         | .. line-block::             | int                  |
 | 
					
						
							|  |  |  | |                             |                             |                      |
 | 
					
						
							|  |  |  | |                             |    :c:type:`PyObject` *     |                      |
 | 
					
						
							|  |  |  | |                             |    FILE *                   |                      |
 | 
					
						
							|  |  |  | |                             |    int                      |                      |
 | 
					
						
							|  |  |  | +-----------------------------+-----------------------------+----------------------+
 | 
					
						
							|  |  |  | | :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` *        | 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`           | void *                      | 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` *     |                      |
 | 
					
						
							|  |  |  | |                             |    Py_ssize_t               |                      |
 | 
					
						
							|  |  |  | +-----------------------------+-----------------------------+----------------------+
 | 
					
						
							|  |  |  | | :c:type:`ssizeobjargproc`   | .. line-block::             | int                  |
 | 
					
						
							|  |  |  | |                             |                             |                      |
 | 
					
						
							|  |  |  | |                             |    :c:type:`PyObject` *     |                      |
 | 
					
						
							|  |  |  | |                             |    Py_ssize_t               |                      |
 | 
					
						
							|  |  |  | +-----------------------------+-----------------------------+----------------------+
 | 
					
						
							|  |  |  | | :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
 | 
					
						
							|  |  |  | -----------------------
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | The structure definition for :c:type:`PyTypeObject` can be found in
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | :file:`Include/object.h`.  For convenience of reference, this repeats the
 | 
					
						
							|  |  |  | definition found there:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  | .. XXX Drop this?
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | .. literalinclude:: ../includes/typestruct.h
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  | PyObject Slots
 | 
					
						
							|  |  |  | --------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | The type object structure extends the :c:type:`PyVarObject` structure. The
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | :attr:`ob_size` field is used for dynamic types (created by  :func:`type_new`,
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | usually called from a class statement). Note that :c:data:`PyType_Type` (the
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  | metatype) initializes :c:member:`~PyTypeObject.tp_itemsize`, which means that its instances (i.e.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | type objects) *must* have the :attr:`ob_size` field.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: PyObject* PyObject._ob_next
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |              PyObject* PyObject._ob_prev
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    These fields are only present when the macro ``Py_TRACE_REFS`` is defined.
 | 
					
						
							|  |  |  |    Their initialization to *NULL* is taken care of by the ``PyObject_HEAD_INIT``
 | 
					
						
							|  |  |  |    macro.  For statically allocated objects, these fields always remain *NULL*.
 | 
					
						
							|  |  |  |    For dynamically allocated objects, these two fields are used to link the object
 | 
					
						
							|  |  |  |    into a doubly-linked list of *all* live objects on the heap.  This could be used
 | 
					
						
							|  |  |  |    for various debugging purposes; currently the only use is to print the objects
 | 
					
						
							|  |  |  |    that are still alive at the end of a run when the environment variable
 | 
					
						
							|  |  |  |    :envvar:`PYTHONDUMPREFS` is set.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    These fields are not inherited by subtypes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: Py_ssize_t PyObject.ob_refcnt
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    This is the type object's reference count, initialized to ``1`` by the
 | 
					
						
							|  |  |  |    ``PyObject_HEAD_INIT`` macro.  Note that for statically allocated type objects,
 | 
					
						
							|  |  |  |    the type's instances (objects whose :attr:`ob_type` points back to the type) do
 | 
					
						
							|  |  |  |    *not* count as references.  But for dynamically allocated type objects, the
 | 
					
						
							|  |  |  |    instances *do* count as references.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    This field is not inherited by subtypes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: PyTypeObject* PyObject.ob_type
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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.
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    :c:func:`PyType_Ready` checks if :attr:`ob_type` is *NULL*, and if so,
 | 
					
						
							| 
									
										
										
										
											2008-05-12 18:05:20 +00:00
										 |  |  |    initializes it to the :attr:`ob_type` field of the base class.
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    :c:func:`PyType_Ready` will not change this field if it is non-zero.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-12 18:05:20 +00:00
										 |  |  |    This field is inherited by subtypes.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  | PyVarObject Slots
 | 
					
						
							|  |  |  | -----------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: Py_ssize_t PyVarObject.ob_size
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    For statically allocated type objects, this should be initialized to zero.  For
 | 
					
						
							|  |  |  |    dynamically allocated type objects, this field has a special internal meaning.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    This field is not inherited by subtypes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  | 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:type:`PyBaseObject_Type`
 | 
					
						
							|  |  |  | and :c:type:`PyType_Type` effectively act as defaults.)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-25 05:06:39 +00:00
										 |  |  | .. c:member:: const char* PyTypeObject.tp_name
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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`
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    should have the :c:member:`~PyTypeObject.tp_name` initializer ``"P.Q.M.T"``.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    For dynamically allocated type objects, this should just be the type name, and
 | 
					
						
							|  |  |  |    the module name explicitly stored in the type dict as the value for key
 | 
					
						
							|  |  |  |    ``'__module__'``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    For statically allocated type objects, the tp_name field should contain a dot.
 | 
					
						
							|  |  |  |    Everything before the last dot is made accessible as the :attr:`__module__`
 | 
					
						
							|  |  |  |    attribute, and everything after the last dot is made accessible as the
 | 
					
						
							| 
									
										
										
										
											2016-06-18 03:57:31 +00:00
										 |  |  |    :attr:`~definition.__name__` attribute.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    If no dot is present, the entire :c:member:`~PyTypeObject.tp_name` field is made accessible as the
 | 
					
						
							| 
									
										
										
										
											2016-06-18 03:57:31 +00:00
										 |  |  |    :attr:`~definition.__name__` attribute, and the :attr:`__module__` attribute is undefined
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    (unless explicitly set in the dictionary, as explained above).  This means your
 | 
					
						
							| 
									
										
										
										
											2016-10-07 23:24:35 +03:00
										 |  |  |    type will be impossible to pickle.  Additionally, it will not be listed in
 | 
					
						
							|  |  |  |    module documentations created with pydoc.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    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:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    This field is not inherited by subtypes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: Py_ssize_t PyTypeObject.tp_basicsize
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |              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
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :c:member:`~PyTypeObject.tp_itemsize` field, types with variable-length instances have a non-zero
 | 
					
						
							|  |  |  |    :c:member:`~PyTypeObject.tp_itemsize` field.  For a type with fixed-length instances, all
 | 
					
						
							|  |  |  |    instances have the same size, given in :c:member:`~PyTypeObject.tp_basicsize`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    For a type with variable-length instances, the instances must have an
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :attr:`ob_size` field, and the instance size is :c:member:`~PyTypeObject.tp_basicsize` plus N
 | 
					
						
							|  |  |  |    times :c:member:`~PyTypeObject.tp_itemsize`, where N is the "length" of the object.  The value of
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    N is typically stored in the instance's :attr:`ob_size` field.  There are
 | 
					
						
							| 
									
										
										
										
											2009-01-17 10:21:23 +00:00
										 |  |  |    exceptions:  for example, ints use a negative :attr:`ob_size` to indicate a
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    negative number, and N is ``abs(ob_size)`` there.  Also, the presence of an
 | 
					
						
							|  |  |  |    :attr:`ob_size` field in the instance layout doesn't mean that the instance
 | 
					
						
							|  |  |  |    structure is variable-length (for example, the structure for the list type has
 | 
					
						
							|  |  |  |    fixed-length instances, yet those instances have a meaningful :attr:`ob_size`
 | 
					
						
							|  |  |  |    field).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The basic size includes the fields in the instance declared by the macro
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    :c:macro:`PyObject_HEAD` or :c:macro:`PyObject_VAR_HEAD` (whichever is used to
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    declare the instance struct) and this in turn includes the :attr:`_ob_prev` and
 | 
					
						
							|  |  |  |    :attr:`_ob_next` fields if they are present.  This means that the only correct
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    way to get an initializer for the :c:member:`~PyTypeObject.tp_basicsize` is to use the
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    ``sizeof`` operator on the struct used to declare the instance layout.
 | 
					
						
							| 
									
										
										
										
											2008-05-12 18:05:20 +00:00
										 |  |  |    The basic size does not include the GC header size.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    A note about alignment: if the variable items require a particular alignment,
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    this should be taken care of by the value of :c:member:`~PyTypeObject.tp_basicsize`.  Example:
 | 
					
						
							|  |  |  |    suppose a type implements an array of ``double``. :c:member:`~PyTypeObject.tp_itemsize` is
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    ``sizeof(double)``. It is the programmer's responsibility that
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :c:member:`~PyTypeObject.tp_basicsize` is a multiple of ``sizeof(double)`` (assuming this is the
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    alignment requirement for ``double``).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    For any type with variable-length instances, this field must not be *NULL*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    These fields are inherited separately by subtypes.  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).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: destructor PyTypeObject.tp_dealloc
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    A pointer to the instance destructor function.  This function must be defined
 | 
					
						
							|  |  |  |    unless the type guarantees that its instances will never be deallocated (as is
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    the case for the singletons ``None`` and ``Ellipsis``).  The function signature is::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       void tp_dealloc(PyObject *self);
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    The destructor function is called by the :c:func:`Py_DECREF` and
 | 
					
						
							|  |  |  |    :c:func:`Py_XDECREF` macros when the new reference count is zero.  At this point,
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    the instance is still in existence, but there are no references to it.  The
 | 
					
						
							|  |  |  |    destructor function should free all references which the instance owns, free all
 | 
					
						
							|  |  |  |    memory buffers owned by the instance (using the freeing function corresponding
 | 
					
						
							|  |  |  |    to the allocation function used to allocate the buffer), and finally (as its
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    last action) call the type's :c:member:`~PyTypeObject.tp_free` function.  If the type is not
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    subtypable (doesn't have the :const:`Py_TPFLAGS_BASETYPE` flag bit set), it is
 | 
					
						
							|  |  |  |    permissible to call the object deallocator directly instead of via
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :c:member:`~PyTypeObject.tp_free`.  The object deallocator should be the one used to allocate the
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    instance; this is normally :c:func:`PyObject_Del` if the instance was allocated
 | 
					
						
							|  |  |  |    using :c:func:`PyObject_New` or :c:func:`PyObject_VarNew`, or
 | 
					
						
							|  |  |  |    :c:func:`PyObject_GC_Del` if the instance was allocated using
 | 
					
						
							|  |  |  |    :c:func:`PyObject_GC_New` or :c:func:`PyObject_GC_NewVar`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    This field is inherited by subtypes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: printfunc PyTypeObject.tp_print
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-05 16:38:02 +02:00
										 |  |  |    Reserved slot, formerly used for print formatting in Python 2.x.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: getattrfunc PyTypeObject.tp_getattr
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    An optional pointer to the get-attribute-string function.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This field is deprecated.  When it is defined, it should point to a function
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    that acts the same as the :c:member:`~PyTypeObject.tp_getattro` function, but taking a C string
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    instead of a Python string object to give the attribute name.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    **Inheritance:**
 | 
					
						
							| 
									
										
										
										
											2016-12-10 05:56:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    Group: :attr:`tp_getattr`, :attr:`tp_getattro`
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    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*.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: setattrfunc PyTypeObject.tp_setattr
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-08 00:03:20 +00:00
										 |  |  |    An optional pointer to the function for setting and deleting attributes.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    This field is deprecated.  When it is defined, it should point to a function
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    that acts the same as the :c:member:`~PyTypeObject.tp_setattro` function, but taking a C string
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    instead of a Python string object to give the attribute name.
 | 
					
						
							| 
									
										
										
										
											2016-12-10 05:56:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Group: :attr:`tp_setattr`, :attr:`tp_setattro`
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    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*.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  | .. c:member:: PyAsyncMethods* PyTypeObject.tp_as_async
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-21 11:50:30 -04:00
										 |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2015-05-21 17:02:31 -04:00
										 |  |  |       Formerly known as ``tp_compare`` and ``tp_reserved``.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The :c:member:`~PyTypeObject.tp_as_async` field is not inherited,
 | 
					
						
							|  |  |  |    but the contained fields are inherited individually.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: reprfunc PyTypeObject.tp_repr
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. index:: builtin: repr
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    An optional pointer to a function that implements the built-in function
 | 
					
						
							|  |  |  |    :func:`repr`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    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.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This field is inherited by subtypes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    **Default:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    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.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  | .. c:member:: PyNumberMethods* PyTypeObject.tp_as_number
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    The :c:member:`~PyTypeObject.tp_as_number` field is not inherited, but the contained fields are
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    inherited individually.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  | .. c:member:: PySequenceMethods* PyTypeObject.tp_as_sequence
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    The :c:member:`~PyTypeObject.tp_as_sequence` field is not inherited, but the contained fields
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    are inherited individually.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  | .. c:member:: PyMappingMethods* PyTypeObject.tp_as_mapping
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    The :c:member:`~PyTypeObject.tp_as_mapping` field is not inherited, but the contained fields
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    are inherited individually.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: hashfunc PyTypeObject.tp_hash
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. index:: builtin: hash
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    An optional pointer to a function that implements the built-in function
 | 
					
						
							|  |  |  |    :func:`hash`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2010-10-17 20:54:53 +00:00
										 |  |  |    normal return value; when an error occurs during the computation of the hash
 | 
					
						
							|  |  |  |    value, the function should set an exception and return ``-1``.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    When this field is not set (*and* :attr:`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`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    This field can be set explicitly to :c:func:`PyObject_HashNotImplemented` to
 | 
					
						
							| 
									
										
										
										
											2008-08-18 13:18:16 +00:00
										 |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    :c:func:`PyObject_HashNotImplemented`.
 | 
					
						
							| 
									
										
										
										
											2008-08-18 13:18:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Group: :attr:`tp_hash`, :attr:`tp_richcompare`
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-02 21:29:40 +00:00
										 |  |  |    This field is inherited by subtypes together with
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :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*.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: ternaryfunc PyTypeObject.tp_call
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    for :c:func:`PyObject_Call`::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       PyObject *tp_call(PyObject *self, PyObject *args, PyObject *kwargs);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    **Inheritance:**
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    This field is inherited by subtypes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: reprfunc PyTypeObject.tp_str
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    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.)
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    representation of the object, as this is the representation that will be used,
 | 
					
						
							|  |  |  |    among other things, by the :func:`print` function.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    This field is inherited by subtypes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Default:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    When this field is not set, :c:func:`PyObject_Repr` is called to return a string
 | 
					
						
							|  |  |  |    representation.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: getattrofunc PyTypeObject.tp_getattro
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    An optional pointer to the get-attribute function.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    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: :attr:`tp_getattr`, :attr:`tp_getattro`
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    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*.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Default:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    :c:type:`PyBaseObject_Type` uses :c:func:`PyObject_GenericGetAttr`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: setattrofunc PyTypeObject.tp_setattro
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-08 00:03:20 +00:00
										 |  |  |    An optional pointer to the function for setting and deleting attributes.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    The signature is the same as for :c:func:`PyObject_SetAttr`::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       PyObject *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: :attr:`tp_setattr`, :attr:`tp_setattro`
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    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*.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Default:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    :c:type:`PyBaseObject_Type` uses :c:func:`PyObject_GenericSetAttr`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: PyBufferProcs* PyTypeObject.tp_as_buffer
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The :c:member:`~PyTypeObject.tp_as_buffer` field is not inherited,
 | 
					
						
							|  |  |  |    but the contained fields are inherited individually.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-25 05:06:39 +00:00
										 |  |  | .. c:member:: unsigned long PyTypeObject.tp_flags
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :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
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    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.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    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 :const:`Py_TPFLAGS_HAVE_GC` flag bit is inherited together with
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    the :c:member:`~PyTypeObject.tp_traverse` and :c:member:`~PyTypeObject.tp_clear` fields, i.e. if the
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    :const:`Py_TPFLAGS_HAVE_GC` flag bit is clear in the subtype and the
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :c:member:`~PyTypeObject.tp_traverse` and :c:member:`~PyTypeObject.tp_clear` fields in the subtype exist and have
 | 
					
						
							| 
									
										
										
										
											2008-05-12 18:05:20 +00:00
										 |  |  |    *NULL* values.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    .. XXX are most flag bits *really* inherited individually?
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    **Default:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    :c:type:`PyBaseObject_Type` uses
 | 
					
						
							|  |  |  |    ``Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    **Bit Masks:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    The following bit masks are currently defined; these can be ORed together using
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    the ``|`` operator to form the value of the :c:member:`~PyTypeObject.tp_flags` field.  The macro
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    :c:func:`PyType_HasFeature` takes a type and a flags value, *tp* and *f*, and
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    checks whether ``tp->tp_flags & f`` is non-zero.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. data:: Py_TPFLAGS_HEAPTYPE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       This bit is set when the type object itself is allocated on the heap.  In this
 | 
					
						
							|  |  |  |       case, the :attr:`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).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |       **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       ???
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. data:: 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).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |       **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       ???
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. data:: Py_TPFLAGS_READY
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       This bit is set when the type object has been fully initialized by
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |       :c:func:`PyType_Ready`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |       **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       ???
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. data:: Py_TPFLAGS_READYING
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |       This bit is set while :c:func:`PyType_Ready` is in the process of initializing
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |       the type object.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |       **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       ???
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. data:: Py_TPFLAGS_HAVE_GC
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       This bit is set when the object supports garbage collection.  If this bit
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |       is set, instances must be created using :c:func:`PyObject_GC_New` and
 | 
					
						
							|  |  |  |       destroyed using :c:func:`PyObject_GC_Del`.  More information in section
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |       :ref:`supporting-cycle-detection`.  This bit also implies that the
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |       GC-related fields :c:member:`~PyTypeObject.tp_traverse` and :c:member:`~PyTypeObject.tp_clear` are present in
 | 
					
						
							| 
									
										
										
										
											2008-05-12 18:05:20 +00:00
										 |  |  |       the type object.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |       **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Group: :const:`Py_TPFLAGS_HAVE_GC`, :attr:`tp_traverse`, :attr:`tp_clear`
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       The :const:`Py_TPFLAGS_HAVE_GC` flag bit is inherited
 | 
					
						
							|  |  |  |       together with the :attr:`tp_traverse` and :attr:`tp_clear`
 | 
					
						
							|  |  |  |       fields, i.e.  if the :const:`Py_TPFLAGS_HAVE_GC` flag bit is
 | 
					
						
							|  |  |  |       clear in the subtype and the :attr:`tp_traverse` and
 | 
					
						
							|  |  |  |       :attr:`tp_clear` fields in the subtype exist and have *NULL*
 | 
					
						
							|  |  |  |       values.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    .. data:: 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
 | 
					
						
							| 
									
										
										
										
											2008-05-12 18:05:20 +00:00
										 |  |  |       the following bits: :const:`Py_TPFLAGS_HAVE_STACKLESS_EXTENSION`,
 | 
					
						
							|  |  |  |       :const:`Py_TPFLAGS_HAVE_VERSION_TAG`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |       **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       ???
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. XXX Document more flags here?
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-29 01:39:03 +02:00
										 |  |  |    .. data:: Py_TPFLAGS_LONG_SUBCLASS
 | 
					
						
							|  |  |  |    .. data:: Py_TPFLAGS_LIST_SUBCLASS
 | 
					
						
							|  |  |  |    .. data:: Py_TPFLAGS_TUPLE_SUBCLASS
 | 
					
						
							|  |  |  |    .. data:: Py_TPFLAGS_BYTES_SUBCLASS
 | 
					
						
							|  |  |  |    .. data:: Py_TPFLAGS_UNICODE_SUBCLASS
 | 
					
						
							|  |  |  |    .. data:: Py_TPFLAGS_DICT_SUBCLASS
 | 
					
						
							|  |  |  |    .. data:: Py_TPFLAGS_BASE_EXC_SUBCLASS
 | 
					
						
							|  |  |  |    .. data:: 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.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-30 19:59:21 +02:00
										 |  |  |    .. data:: Py_TPFLAGS_HAVE_FINALIZE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:14:43 +02:00
										 |  |  |       This bit is set when the :c:member:`~PyTypeObject.tp_finalize` slot is present in the
 | 
					
						
							| 
									
										
										
										
											2013-07-30 19:59:21 +02:00
										 |  |  |       type structure.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.4
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-25 05:06:39 +00:00
										 |  |  | .. c:member:: const char* PyTypeObject.tp_doc
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    An optional pointer to a NUL-terminated C string giving the docstring for this
 | 
					
						
							|  |  |  |    type object.  This is exposed as the :attr:`__doc__` attribute on the type and
 | 
					
						
							|  |  |  |    instances of the type.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    This field is *not* inherited by subtypes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: traverseproc PyTypeObject.tp_traverse
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    An optional pointer to a traversal function for the garbage collector.  This is
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    only used if the :const:`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`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    simply calls :c:func:`Py_VISIT` on each of the instance's members that are Python
 | 
					
						
							|  |  |  |    objects.  For example, this is function :c:func:`local_traverse` from the
 | 
					
						
							| 
									
										
										
										
											2008-05-25 13:05:15 +00:00
										 |  |  |    :mod:`_thread` extension module::
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       static int
 | 
					
						
							|  |  |  |       local_traverse(localobject *self, visitproc visit, void *arg)
 | 
					
						
							|  |  |  |       {
 | 
					
						
							|  |  |  |           Py_VISIT(self->args);
 | 
					
						
							|  |  |  |           Py_VISIT(self->kw);
 | 
					
						
							|  |  |  |           Py_VISIT(self->dict);
 | 
					
						
							|  |  |  |           return 0;
 | 
					
						
							|  |  |  |       }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    Note that :c:func:`Py_VISIT` is called only on those members that can participate
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2013-10-09 13:26:17 +03:00
										 |  |  |    :func:`~gc.get_referents` function will include it.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    anything.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Group: :const:`Py_TPFLAGS_HAVE_GC`, :attr:`tp_traverse`, :attr:`tp_clear`
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    This field is inherited by subtypes together with :c:member:`~PyTypeObject.tp_clear` and the
 | 
					
						
							|  |  |  |    :const:`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
 | 
					
						
							| 
									
										
										
										
											2008-05-12 18:05:20 +00:00
										 |  |  |    the subtype.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: inquiry PyTypeObject.tp_clear
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    An optional pointer to a clear function for the garbage collector. This is only
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    used if the :const:`Py_TPFLAGS_HAVE_GC` flag bit is set.  The signature is::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       int tp_clear(PyObject *);
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    The :c:member:`~PyTypeObject.tp_clear` member function is used to break reference cycles in cyclic
 | 
					
						
							|  |  |  |    garbage detected by the garbage collector.  Taken together, all :c:member:`~PyTypeObject.tp_clear`
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    functions in the system must combine to break all reference cycles.  This is
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    possible to prove that no reference cycle can be composed entirely of tuples.
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    Therefore the :c:member:`~PyTypeObject.tp_clear` functions of other types must be sufficient to
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    break any cycle containing a tuple.  This isn't immediately obvious, and there's
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    rarely a good reason to avoid implementing :c:member:`~PyTypeObject.tp_clear`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    Implementations of :c:member:`~PyTypeObject.tp_clear` should drop the instance's references to
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    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(localobject *self)
 | 
					
						
							|  |  |  |       {
 | 
					
						
							|  |  |  |           Py_CLEAR(self->key);
 | 
					
						
							|  |  |  |           Py_CLEAR(self->args);
 | 
					
						
							|  |  |  |           Py_CLEAR(self->kw);
 | 
					
						
							|  |  |  |           Py_CLEAR(self->dict);
 | 
					
						
							|  |  |  |           return 0;
 | 
					
						
							|  |  |  |       }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    The :c:func:`Py_CLEAR` macro should be used, because clearing references is
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    delicate:  the reference to the contained object must not be decremented until
 | 
					
						
							|  |  |  |    after the pointer to the contained object is set to *NULL*.  This is because
 | 
					
						
							|  |  |  |    decrementing the reference count may cause the contained object to become trash,
 | 
					
						
							|  |  |  |    triggering a chain of reclamation activity that may include invoking arbitrary
 | 
					
						
							|  |  |  |    Python code (due to finalizers, or weakref callbacks, associated with the
 | 
					
						
							|  |  |  |    contained object). If it's possible for such code to reference *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
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    :c:func:`Py_CLEAR` macro performs the operations in a safe order.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    Because the goal of :c:member:`~PyTypeObject.tp_clear` functions is to break reference cycles,
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    it's not necessary to clear contained objects like Python strings or Python
 | 
					
						
							|  |  |  |    integers, which can't participate in reference cycles. On the other hand, it may
 | 
					
						
							|  |  |  |    be convenient to clear all contained Python objects, and write the type's
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :c:member:`~PyTypeObject.tp_dealloc` function to invoke :c:member:`~PyTypeObject.tp_clear`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    More information about Python's garbage collection scheme can be found in
 | 
					
						
							|  |  |  |    section :ref:`supporting-cycle-detection`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Group: :const:`Py_TPFLAGS_HAVE_GC`, :attr:`tp_traverse`, :attr:`tp_clear`
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    This field is inherited by subtypes together with :c:member:`~PyTypeObject.tp_traverse` and the
 | 
					
						
							|  |  |  |    :const:`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
 | 
					
						
							| 
									
										
										
										
											2008-05-12 18:05:20 +00:00
										 |  |  |    the subtype.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: richcmpfunc PyTypeObject.tp_richcompare
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    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`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-21 11:20:28 +00:00
										 |  |  |    The function should return the result of the comparison (usually ``Py_True``
 | 
					
						
							|  |  |  |    or ``Py_False``).  If the comparison is undefined, it must return
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    ``Py_NotImplemented``, if another error occurred it must return *NULL* and
 | 
					
						
							| 
									
										
										
										
											2008-01-21 11:20:28 +00:00
										 |  |  |    set an exception condition.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       If you want to implement a type for which only a limited set of
 | 
					
						
							|  |  |  |       comparisons makes sense (e.g. ``==`` and ``!=``, but not ``<`` and
 | 
					
						
							|  |  |  |       friends), directly raise :exc:`TypeError` in the rich comparison function.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    The following constants are defined to be used as the third argument for
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :c:member:`~PyTypeObject.tp_richcompare` and for :c:func:`PyObject_RichCompare`:
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    +----------------+------------+
 | 
					
						
							|  |  |  |    | Constant       | Comparison |
 | 
					
						
							|  |  |  |    +================+============+
 | 
					
						
							|  |  |  |    | :const:`Py_LT` | ``<``      |
 | 
					
						
							|  |  |  |    +----------------+------------+
 | 
					
						
							|  |  |  |    | :const:`Py_LE` | ``<=``     |
 | 
					
						
							|  |  |  |    +----------------+------------+
 | 
					
						
							|  |  |  |    | :const:`Py_EQ` | ``==``     |
 | 
					
						
							|  |  |  |    +----------------+------------+
 | 
					
						
							|  |  |  |    | :const:`Py_NE` | ``!=``     |
 | 
					
						
							|  |  |  |    +----------------+------------+
 | 
					
						
							|  |  |  |    | :const:`Py_GT` | ``>``      |
 | 
					
						
							|  |  |  |    +----------------+------------+
 | 
					
						
							|  |  |  |    | :const:`Py_GE` | ``>=``     |
 | 
					
						
							|  |  |  |    +----------------+------------+
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-02 11:32:54 +01:00
										 |  |  |    The following macro is defined to ease writing rich comparison functions:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    .. c:function:: PyObject \*Py_RETURN_RICHCOMPARE(VAL_A, VAL_B, int op)
 | 
					
						
							| 
									
										
										
										
											2017-11-02 11:32:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       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 return value's reference count is properly incremented.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |       On error, sets an exception and returns *NULL* from the function.
 | 
					
						
							| 
									
										
										
										
											2017-11-02 11:32:54 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       .. versionadded:: 3.7
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Group: :attr:`tp_hash`, :attr:`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:type:`PyBaseObject_Type` provides a :attr:`tp_richcompare`
 | 
					
						
							|  |  |  |    implementation, which may be inherited.  However, if only
 | 
					
						
							|  |  |  |    :attr:`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.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-21 11:20:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-25 05:06:39 +00:00
										 |  |  | .. c:member:: Py_ssize_t PyTypeObject.tp_weaklistoffset
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    :c:func:`PyObject_ClearWeakRefs` and the :c:func:`PyWeakref_\*` functions.  The
 | 
					
						
							|  |  |  |    instance structure needs to include a field of type :c:type:`PyObject\*` which is
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    initialized to *NULL*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    Do not confuse this field with :c:member:`~PyTypeObject.tp_weaklist`; that is the list head for
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    weak references to the type object itself.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :c:member:`~PyTypeObject.tp_weaklistoffset`, this should not be a problem.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-09 13:26:17 +03:00
										 |  |  |    When a type defined by a class statement has no :attr:`~object.__slots__` declaration,
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    and none of its base types are weakly referenceable, the type is made weakly
 | 
					
						
							|  |  |  |    referenceable by adding a weak reference list head slot to the instance layout
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    and setting the :c:member:`~PyTypeObject.tp_weaklistoffset` of that slot's offset.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    When a type's :attr:`__slots__` declaration contains a slot named
 | 
					
						
							|  |  |  |    :attr:`__weakref__`, that slot becomes the weak reference list head for
 | 
					
						
							|  |  |  |    instances of the type, and the slot's offset is stored in the type's
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :c:member:`~PyTypeObject.tp_weaklistoffset`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    When a type's :attr:`__slots__` declaration does not contain a slot named
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :attr:`__weakref__`, the type inherits its :c:member:`~PyTypeObject.tp_weaklistoffset` from its
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    base type.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: getiterfunc PyTypeObject.tp_iter
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    An optional pointer to a function that returns an iterator for the object.  Its
 | 
					
						
							|  |  |  |    presence normally signals that the instances of this type are iterable (although
 | 
					
						
							| 
									
										
										
										
											2008-04-07 19:17:06 +00:00
										 |  |  |    sequences may be iterable without this function).
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    This function has the same signature as :c:func:`PyObject_GetIter`::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       PyObject *tp_iter(PyObject *self);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    **Inheritance:**
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    This field is inherited by subtypes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: iternextfunc PyTypeObject.tp_iternext
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-30 20:06:53 +00:00
										 |  |  |    An optional pointer to a function that returns the next item in an iterator.
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    The signature is::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       PyObject *tp_iternext(PyObject *self);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-30 20:06:53 +00:00
										 |  |  |    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.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    Iterator types should also define the :c:member:`~PyTypeObject.tp_iter` function, and that
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    function should return the iterator instance itself (not a new iterator
 | 
					
						
							|  |  |  |    instance).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    This function has the same signature as :c:func:`PyIter_Next`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    This field is inherited by subtypes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: struct PyMethodDef* PyTypeObject.tp_methods
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    An optional pointer to a static *NULL*-terminated array of :c:type:`PyMethodDef`
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    structures, declaring regular methods of this type.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    For each entry in the array, an entry is added to the type's dictionary (see
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :c:member:`~PyTypeObject.tp_dict` below) containing a method descriptor.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    This field is not inherited by subtypes (methods are inherited through a
 | 
					
						
							|  |  |  |    different mechanism).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: struct PyMemberDef* PyTypeObject.tp_members
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    An optional pointer to a static *NULL*-terminated array of :c:type:`PyMemberDef`
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :c:member:`~PyTypeObject.tp_dict` below) containing a member descriptor.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    This field is not inherited by subtypes (members are inherited through a
 | 
					
						
							|  |  |  |    different mechanism).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: struct PyGetSetDef* PyTypeObject.tp_getset
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    An optional pointer to a static *NULL*-terminated array of :c:type:`PyGetSetDef`
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :c:member:`~PyTypeObject.tp_dict` below) containing a getset descriptor.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    This field is not inherited by subtypes (computed attributes are inherited
 | 
					
						
							|  |  |  |    through a different mechanism).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: PyTypeObject* PyTypeObject.tp_base
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    .. 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:func:`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`).
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: PyObject* PyTypeObject.tp_dict
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    The type's dictionary is stored here by :c:func:`PyType_Ready`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    This field should normally be initialized to *NULL* before PyType_Ready is
 | 
					
						
							|  |  |  |    called; it may also be initialized to a dictionary containing initial attributes
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    for the type.  Once :c:func:`PyType_Ready` has initialized the type, extra
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    attributes for the type may be added to this dictionary only if they don't
 | 
					
						
							|  |  |  |    correspond to overloaded operations (like :meth:`__add__`).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    This field is not inherited by subtypes (though the attributes defined in here
 | 
					
						
							|  |  |  |    are inherited through a different mechanism).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Default:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    If this field is *NULL*, :c:func:`PyType_Ready` will assign a new
 | 
					
						
							|  |  |  |    dictionary to it.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-09 16:07:01 -05:00
										 |  |  |    .. warning::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       It is not safe to use :c:func:`PyDict_SetItem` on or otherwise modify
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |       :c:member:`~PyTypeObject.tp_dict` with the dictionary C-API.
 | 
					
						
							| 
									
										
										
										
											2011-08-09 16:07:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: descrgetfunc PyTypeObject.tp_descr_get
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    An optional pointer to a "descriptor get" function.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    The function signature is::
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       PyObject * tp_descr_get(PyObject *self, PyObject *obj, PyObject *type);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    .. XXX explain more?
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    **Inheritance:**
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    This field is inherited by subtypes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: descrsetfunc PyTypeObject.tp_descr_set
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-08 00:03:20 +00:00
										 |  |  |    An optional pointer to a function for setting and deleting
 | 
					
						
							|  |  |  |    a descriptor's value.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    The function signature is::
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       int tp_descr_set(PyObject *self, PyObject *obj, PyObject *value);
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-08 00:03:20 +00:00
										 |  |  |    The *value* argument is set to *NULL* to delete the value.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    .. XXX explain more?
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This field is inherited by subtypes.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-25 05:06:39 +00:00
										 |  |  | .. c:member:: Py_ssize_t PyTypeObject.tp_dictoffset
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    :c:func:`PyObject_GenericGetAttr`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    Do not confuse this field with :c:member:`~PyTypeObject.tp_dict`; that is the dictionary for
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    attributes of the type object itself.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    If the value of this field is greater than zero, it specifies the offset from
 | 
					
						
							|  |  |  |    the start of the instance structure.  If the value is less than zero, it
 | 
					
						
							|  |  |  |    specifies the offset from the *end* of the instance structure.  A negative
 | 
					
						
							|  |  |  |    offset is more expensive to use, and should only be used when the instance
 | 
					
						
							|  |  |  |    structure contains a variable-length part.  This is used for example to add an
 | 
					
						
							|  |  |  |    instance variable dictionary to subtypes of :class:`str` or :class:`tuple`. Note
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    that the :c:member:`~PyTypeObject.tp_basicsize` field should account for the dictionary added to
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    the end in that case, even though the dictionary is not included in the basic
 | 
					
						
							|  |  |  |    object layout.  On a system with a pointer size of 4 bytes,
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :c:member:`~PyTypeObject.tp_dictoffset` should be set to ``-4`` to indicate that the dictionary is
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    at the very end of the structure.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The real dictionary offset in an instance can be computed from a negative
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :c:member:`~PyTypeObject.tp_dictoffset` as follows::
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       dictoffset = tp_basicsize + abs(ob_size)*tp_itemsize + tp_dictoffset
 | 
					
						
							|  |  |  |       if dictoffset is not aligned on sizeof(void*):
 | 
					
						
							|  |  |  |           round up to sizeof(void*)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    where :c:member:`~PyTypeObject.tp_basicsize`, :c:member:`~PyTypeObject.tp_itemsize` and :c:member:`~PyTypeObject.tp_dictoffset` are
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    taken from the type object, and :attr:`ob_size` is taken from the instance.  The
 | 
					
						
							| 
									
										
										
										
											2009-01-17 10:21:23 +00:00
										 |  |  |    absolute value is taken because ints use the sign of :attr:`ob_size` to
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    store the sign of the number.  (There's never a need to do this calculation
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    yourself; it is done for you by :c:func:`_PyObject_GetDictPtr`.)
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    This field is inherited by subtypes, but see the rules listed below. A subtype
 | 
					
						
							|  |  |  |    may override this offset; this means that the subtype instances store the
 | 
					
						
							|  |  |  |    dictionary at a difference offset than the base type.  Since the dictionary is
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    always found via :c:member:`~PyTypeObject.tp_dictoffset`, this should not be a problem.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-09 13:26:17 +03:00
										 |  |  |    When a type defined by a class statement has no :attr:`~object.__slots__` declaration,
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    and none of its base types has an instance variable dictionary, a dictionary
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    slot is added to the instance layout and the :c:member:`~PyTypeObject.tp_dictoffset` is set to
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    that slot's offset.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    When a type defined by a class statement has a :attr:`__slots__` declaration,
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    the type inherits its :c:member:`~PyTypeObject.tp_dictoffset` from its base type.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-09 13:26:17 +03:00
										 |  |  |    (Adding a slot named :attr:`~object.__dict__` to the :attr:`__slots__` declaration does
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    not have the expected effect, it just causes confusion.  Maybe this should be
 | 
					
						
							|  |  |  |    added as a feature just like :attr:`__weakref__` though.)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Default:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This slot has no default.  For static types, if the field is
 | 
					
						
							|  |  |  |    *NULL* then no :attr:`__dict__` gets created for instances.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: initproc PyTypeObject.tp_init
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    An optional pointer to an instance initialization function.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This function corresponds to the :meth:`__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.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    The function signature is::
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |       int tp_init(PyObject *self, PyObject *args, PyObject *kwds);
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    The self argument is the instance to be initialized; the *args* and *kwds*
 | 
					
						
							|  |  |  |    arguments represent positional and keyword arguments of the call to
 | 
					
						
							|  |  |  |    :meth:`__init__`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    instance of some other type that is not a subtype of the original type, no
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :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.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    This field is inherited by subtypes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Default:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    For static types this field does not have a default.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: allocfunc PyTypeObject.tp_alloc
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    An optional pointer to an instance allocation function.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    The function signature is::
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |       PyObject *tp_alloc(PyTypeObject *self, Py_ssize_t nitems);
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    This field is inherited by static subtypes, but not by dynamic
 | 
					
						
							|  |  |  |    subtypes (subtypes created by a class statement).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    **Default:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    For dynamic subtypes, this field is always set to
 | 
					
						
							|  |  |  |    :c:func:`PyType_GenericAlloc`, to force a standard heap
 | 
					
						
							|  |  |  |    allocation strategy.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    For static subtypes, :c:type:`PyBaseObject_Type` uses
 | 
					
						
							|  |  |  |    :c:func:`PyType_GenericAlloc`.  That is the recommended value
 | 
					
						
							|  |  |  |    for all statically defined types.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: newfunc PyTypeObject.tp_new
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    An optional pointer to an instance creation function.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    The function signature is::
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |       PyObject *tp_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds);
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    type.  Note that subtype doesn't have to equal the type whose :c:member:`~PyTypeObject.tp_new`
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    function is called; it may be a subtype of that type (but not an unrelated
 | 
					
						
							|  |  |  |    type).
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    The :c:member:`~PyTypeObject.tp_new` function should call ``subtype->tp_alloc(subtype, nitems)``
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    to allocate space for the object, and then do only as much further
 | 
					
						
							|  |  |  |    initialization as is absolutely necessary.  Initialization that can safely be
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    ignored or repeated should be placed in the :c:member:`~PyTypeObject.tp_init` handler.  A good
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    rule of thumb is that for immutable types, all initialization should take place
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    in :c:member:`~PyTypeObject.tp_new`, while for mutable types, most initialization should be
 | 
					
						
							|  |  |  |    deferred to :c:member:`~PyTypeObject.tp_init`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    This field is inherited by subtypes, except it is not inherited by static types
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    whose :c:member:`~PyTypeObject.tp_base` is *NULL* or ``&PyBaseObject_Type``.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Default:**
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    For 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.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  | .. c:member:: freefunc PyTypeObject.tp_free
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    An optional pointer to an instance deallocation function.  Its signature is::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       void tp_free(void *self);
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    An initializer that is compatible with this signature is :c:func:`PyObject_Free`.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This field is inherited by static subtypes, but not by dynamic
 | 
					
						
							|  |  |  |    subtypes (subtypes created by a class statement)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    **Default:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    In dynamic subtypes, this field is set to a deallocator suitable to
 | 
					
						
							|  |  |  |    match :c:func:`PyType_GenericAlloc` and the value of the
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    :const:`Py_TPFLAGS_HAVE_GC` flag bit.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    For static subtypes, :c:type:`PyBaseObject_Type` uses PyObject_Del.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: inquiry PyTypeObject.tp_is_gc
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    :c:member:`~PyTypeObject.tp_flags` field, and check the :const:`Py_TPFLAGS_HAVE_GC` flag bit.  But
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    ``0`` for a non-collectible instance. The signature is::
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |       int tp_is_gc(PyObject *self);
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    (The only example of this are types themselves.  The metatype,
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    :c:data:`PyType_Type`, defines this function to distinguish between statically
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    and dynamically allocated types.)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-12 18:05:20 +00:00
										 |  |  |    This field is inherited by subtypes.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Default:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This slot has no default.  If this field is *NULL*,
 | 
					
						
							|  |  |  |    :const:`Py_TPFLAGS_HAVE_GC` is used as the functional equivalent.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: PyObject* PyTypeObject.tp_bases
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Tuple of base types.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This is set for types created by a class statement.  It should be *NULL* for
 | 
					
						
							|  |  |  |    statically defined types.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    This field is not inherited.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: PyObject* PyTypeObject.tp_mro
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Tuple containing the expanded set of base types, starting with the type itself
 | 
					
						
							|  |  |  |    and ending with :class:`object`, in Method Resolution Order.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |    **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:: PyObject* PyTypeObject.tp_subclasses
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    List of weak references to subclasses.  Internal use only.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    **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.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    **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.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-30 19:59:21 +02:00
										 |  |  | .. c:member:: destructor PyTypeObject.tp_finalize
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    An optional pointer to an instance finalization function.  Its signature is::
 | 
					
						
							| 
									
										
										
										
											2013-07-30 19:59:21 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |       void tp_finalize(PyObject *self);
 | 
					
						
							| 
									
										
										
										
											2013-07-30 19:59:21 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:14:43 +02:00
										 |  |  |    If :c:member:`~PyTypeObject.tp_finalize` is set, the interpreter calls it once when
 | 
					
						
							| 
									
										
										
										
											2013-07-30 19:59:21 +02:00
										 |  |  |    finalizing an instance.  It is called either from the garbage
 | 
					
						
							|  |  |  |    collector (if the instance is part of an isolated reference cycle) or
 | 
					
						
							|  |  |  |    just before the object is deallocated.  Either way, it is guaranteed
 | 
					
						
							|  |  |  |    to be called before attempting to break reference cycles, ensuring
 | 
					
						
							|  |  |  |    that it finds the object in a sane state.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:14:43 +02:00
										 |  |  |    :c:member:`~PyTypeObject.tp_finalize` should not mutate the current exception status;
 | 
					
						
							| 
									
										
										
										
											2013-07-30 19:59:21 +02:00
										 |  |  |    therefore, a recommended way to write a non-trivial finalizer is::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       static void
 | 
					
						
							|  |  |  |       local_finalize(PyObject *self)
 | 
					
						
							|  |  |  |       {
 | 
					
						
							|  |  |  |           PyObject *error_type, *error_value, *error_traceback;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           /* Save the current exception, if any. */
 | 
					
						
							|  |  |  |           PyErr_Fetch(&error_type, &error_value, &error_traceback);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           /* ... */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           /* Restore the saved exception. */
 | 
					
						
							|  |  |  |           PyErr_Restore(error_type, error_value, error_traceback);
 | 
					
						
							|  |  |  |       }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    For this field to be taken into account (even through inheritance),
 | 
					
						
							|  |  |  |    you must also set the :const:`Py_TPFLAGS_HAVE_FINALIZE` flags bit.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    **Inheritance:**
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-30 19:59:21 +02:00
										 |  |  |    This field is inherited by subtypes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.4
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. seealso:: "Safe object finalization" (:pep:`442`)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | The remaining fields are only defined if the feature test macro
 | 
					
						
							|  |  |  | :const:`COUNT_ALLOCS` is defined, and are for internal use only. They are
 | 
					
						
							|  |  |  | documented here for completeness.  None of these fields are inherited by
 | 
					
						
							|  |  |  | subtypes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: Py_ssize_t PyTypeObject.tp_allocs
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Number of allocations.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: Py_ssize_t PyTypeObject.tp_frees
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Number of frees.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: Py_ssize_t PyTypeObject.tp_maxalloc
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Maximum simultaneously allocated objects.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  | .. c:member:: PyTypeObject* PyTypeObject.tp_prev
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Pointer to the previous type object with a non-zero :c:member:`~PyTypeObject.tp_allocs` field.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: PyTypeObject* PyTypeObject.tp_next
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-01 21:12:45 +02:00
										 |  |  |    Pointer to the next type object with a non-zero :c:member:`~PyTypeObject.tp_allocs` field.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  | Also, note that, in a garbage collected Python, :c:member:`~PyTypeObject.tp_dealloc` may be called from
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | any Python thread, not just the thread which created the object (if the object
 | 
					
						
							|  |  |  | becomes part of a refcount cycle, that cycle might be collected by a garbage
 | 
					
						
							|  |  |  | collection on any thread).  This is not a problem for Python API calls, since
 | 
					
						
							|  |  |  | the thread on which tp_dealloc is called will own the Global Interpreter Lock
 | 
					
						
							|  |  |  | (GIL). However, if the object being destroyed in turn destroys objects from some
 | 
					
						
							|  |  |  | other C or C++ library, care should be taken to ensure that destroying those
 | 
					
						
							|  |  |  | objects on the thread which called tp_dealloc will not violate any assumptions
 | 
					
						
							|  |  |  | of the library.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  | Heap Types
 | 
					
						
							|  |  |  | ----------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In addition to defining Python types statically, you can define them
 | 
					
						
							|  |  |  | dynamically (i.e. to the heap) using  :c:func:`PyType_FromSpec` and
 | 
					
						
							|  |  |  | :c:func:`PyType_FromSpecWithBases`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. XXX Explain how to use PyType_FromSpec().
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. XXX Document PyType_Spec.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | .. _number-structs:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Number Object Structures
 | 
					
						
							|  |  |  | ========================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. sectionauthor:: Amaury Forgeot d'Arc
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:type:: PyNumberMethods
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |    .. XXX Drop the definition?
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    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;
 | 
					
						
							| 
									
										
										
										
											2009-01-17 10:04:45 +00:00
										 |  |  |             void *nb_reserved;
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |             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;
 | 
					
						
							| 
									
										
										
										
											2014-04-09 23:55:56 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |             binaryfunc nb_matrix_multiply;
 | 
					
						
							|  |  |  |             binaryfunc nb_inplace_matrix_multiply;
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |        } 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
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |       ``Py_NotImplemented``, if another error occurred they must return *NULL*
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |       and set an exception.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-17 10:04:45 +00:00
										 |  |  |    .. note::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |       The :c:data:`nb_reserved` field should always be *NULL*.  It
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |       was previously called :c:data:`nb_long`, and was renamed in
 | 
					
						
							| 
									
										
										
										
											2009-01-17 10:04:45 +00:00
										 |  |  |       Python 3.0.1.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  | .. 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
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. _mapping-structs:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Mapping Object Structures
 | 
					
						
							|  |  |  | =========================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. sectionauthor:: Amaury Forgeot d'Arc
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:type:: PyMappingMethods
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    This structure holds pointers to the functions which an object uses to
 | 
					
						
							|  |  |  |    implement the mapping protocol.  It has three members:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: lenfunc PyMappingMethods.mp_length
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-22 11:02:44 +03:00
										 |  |  |    This function is used by :c:func:`PyMapping_Size` and
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    :c:func:`PyObject_Size`, and has the same signature.  This slot may be set to
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    *NULL* if the object has no defined length.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: binaryfunc PyMappingMethods.mp_subscript
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-22 11:02:44 +03:00
										 |  |  |    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.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: objobjargproc PyMappingMethods.mp_ass_subscript
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-22 11:02:44 +03:00
										 |  |  |    This function is used by :c:func:`PyObject_SetItem`,
 | 
					
						
							|  |  |  |    :c:func:`PyObject_DelItem`, :c:func:`PyObject_SetSlice` and
 | 
					
						
							|  |  |  |    :c:func:`PyObject_DelSlice`.  It has the same signature as
 | 
					
						
							|  |  |  |    :c:func:`!PyObject_SetItem`, but *v* can also be set to *NULL* to delete
 | 
					
						
							| 
									
										
										
										
											2015-12-08 00:03:20 +00:00
										 |  |  |    an item.  If this slot is *NULL*, the object does not support item
 | 
					
						
							|  |  |  |    assignment and deletion.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. _sequence-structs:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Sequence Object Structures
 | 
					
						
							|  |  |  | ==========================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. sectionauthor:: Amaury Forgeot d'Arc
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:type:: PySequenceMethods
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    This structure holds pointers to the functions which an object uses to
 | 
					
						
							|  |  |  |    implement the sequence protocol.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: lenfunc PySequenceMethods.sq_length
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-22 11:02:44 +03:00
										 |  |  |    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.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: binaryfunc PySequenceMethods.sq_concat
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    This function is used by :c:func:`PySequence_Concat` and has the same
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    signature.  It is also used by the ``+`` operator, after trying the numeric
 | 
					
						
							| 
									
										
										
										
											2018-05-22 11:02:44 +03:00
										 |  |  |    addition via the :c:member:`~PyNumberMethods.nb_add` slot.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: ssizeargfunc PySequenceMethods.sq_repeat
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    This function is used by :c:func:`PySequence_Repeat` and has the same
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    signature.  It is also used by the ``*`` operator, after trying numeric
 | 
					
						
							| 
									
										
										
										
											2018-05-22 11:02:44 +03:00
										 |  |  |    multiplication via the :c:member:`~PyNumberMethods.nb_multiply` slot.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: ssizeargfunc PySequenceMethods.sq_item
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    This function is used by :c:func:`PySequence_GetItem` and has the same
 | 
					
						
							| 
									
										
										
										
											2018-05-22 11:02:44 +03:00
										 |  |  |    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`
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    function to return ``1``, it can be *NULL* otherwise.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Negative indexes are handled as follows: if the :attr:`sq_length` slot is
 | 
					
						
							|  |  |  |    filled, it is called and the sequence length is used to compute a positive
 | 
					
						
							|  |  |  |    index which is passed to :attr:`sq_item`.  If :attr:`sq_length` is *NULL*,
 | 
					
						
							|  |  |  |    the index is passed as is to the function.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: ssizeobjargproc PySequenceMethods.sq_ass_item
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    This function is used by :c:func:`PySequence_SetItem` and has the same
 | 
					
						
							| 
									
										
										
										
											2018-05-22 11:02:44 +03:00
										 |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2015-12-08 00:03:20 +00:00
										 |  |  |    item assignment and deletion.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: objobjproc PySequenceMethods.sq_contains
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    This function may be used by :c:func:`PySequence_Contains` and has the same
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  |    signature.  This slot may be left to *NULL*, in this case
 | 
					
						
							| 
									
										
										
										
											2018-05-22 11:02:44 +03:00
										 |  |  |    :c:func:`!PySequence_Contains` simply traverses the sequence until it
 | 
					
						
							|  |  |  |    finds a match.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: binaryfunc PySequenceMethods.sq_inplace_concat
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    This function is used by :c:func:`PySequence_InPlaceConcat` and has the same
 | 
					
						
							| 
									
										
										
										
											2018-05-22 11:02:44 +03:00
										 |  |  |    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 inplace addition
 | 
					
						
							|  |  |  |    via the :c:member:`~PyNumberMethods.nb_inplace_add` slot.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  | .. c:member:: ssizeargfunc PySequenceMethods.sq_inplace_repeat
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-06 10:11:56 +00:00
										 |  |  |    This function is used by :c:func:`PySequence_InPlaceRepeat` and has the same
 | 
					
						
							| 
									
										
										
										
											2018-05-22 11:02:44 +03:00
										 |  |  |    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 inplace multiplication
 | 
					
						
							|  |  |  |    via the :c:member:`~PyNumberMethods.nb_inplace_multiply` slot.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. _buffer-structs:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Buffer Object Structures
 | 
					
						
							|  |  |  | ========================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. sectionauthor:: Greg J. Stein <greg@lyra.org>
 | 
					
						
							| 
									
										
										
										
											2008-09-16 02:24:31 +00:00
										 |  |  | .. sectionauthor:: Benjamin Peterson
 | 
					
						
							| 
									
										
										
										
											2012-02-25 12:24:21 +01:00
										 |  |  | .. sectionauthor:: Stefan Krah
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-25 12:24:21 +01:00
										 |  |  | .. c:type:: PyBufferProcs
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-25 12:24:21 +01:00
										 |  |  |    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.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-25 12:24:21 +01:00
										 |  |  | .. c:member:: getbufferproc PyBufferProcs.bf_getbuffer
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-25 12:24:21 +01:00
										 |  |  |    The signature of this function is::
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-25 12:24:21 +01:00
										 |  |  |        int (PyObject *exporter, Py_buffer *view, int flags);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Handle a request to *exporter* to fill in *view* as specified by *flags*.
 | 
					
						
							| 
									
										
										
										
											2012-03-06 14:55:06 +01:00
										 |  |  |    Except for point (3), an implementation of this function MUST take these
 | 
					
						
							|  |  |  |    steps:
 | 
					
						
							| 
									
										
										
										
											2012-02-25 12:24:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 14:55:06 +01:00
										 |  |  |    (1) Check if the request can be met. If not, raise :c:data:`PyExc_BufferError`,
 | 
					
						
							| 
									
										
										
										
											2016-10-27 21:41:19 +03:00
										 |  |  |        set :c:data:`view->obj` to *NULL* and return ``-1``.
 | 
					
						
							| 
									
										
										
										
											2012-02-25 12:24:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 14:55:06 +01:00
										 |  |  |    (2) Fill in the requested fields.
 | 
					
						
							| 
									
										
										
										
											2012-02-25 12:24:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 14:55:06 +01:00
										 |  |  |    (3) Increment an internal counter for the number of exports.
 | 
					
						
							| 
									
										
										
										
											2012-02-25 12:24:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 14:55:06 +01:00
										 |  |  |    (4) Set :c:data:`view->obj` to *exporter* and increment :c:data:`view->obj`.
 | 
					
						
							| 
									
										
										
										
											2012-02-25 12:24:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-27 21:41:19 +03:00
										 |  |  |    (5) Return ``0``.
 | 
					
						
							| 
									
										
										
										
											2012-03-06 14:55:06 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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:data:`view->obj` to a new reference to itself.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    * Redirect: The buffer request is redirected to the root object of the
 | 
					
						
							|  |  |  |      tree. Here, :c:data:`view->obj` will be a new reference to the root
 | 
					
						
							|  |  |  |      object.
 | 
					
						
							| 
									
										
										
										
											2012-02-25 12:24:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |    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.
 | 
					
						
							| 
									
										
										
										
											2012-03-06 14:55:06 +01:00
										 |  |  |    :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`
 | 
					
						
							| 
									
										
										
										
											2012-02-25 12:24:21 +01:00
										 |  |  |    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);
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-25 12:24:21 +01:00
										 |  |  |    Handle a request to release the resources of the buffer. If no resources
 | 
					
						
							| 
									
										
										
										
											2012-03-06 14:55:06 +01:00
										 |  |  |    need to be released, :c:member:`PyBufferProcs.bf_releasebuffer` may be
 | 
					
						
							|  |  |  |    *NULL*. Otherwise, a standard implementation of this function will take
 | 
					
						
							|  |  |  |    these optional steps:
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-06 14:55:06 +01:00
										 |  |  |    (1) Decrement an internal counter for the number of exports.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-27 21:41:19 +03:00
										 |  |  |    (2) If the counter is ``0``, free all memory associated with *view*.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-25 12:24:21 +01:00
										 |  |  |    The exporter MUST use the :c:member:`~Py_buffer.internal` field to keep
 | 
					
						
							| 
									
										
										
										
											2012-03-06 14:55:06 +01:00
										 |  |  |    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.
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-25 12:24:21 +01:00
										 |  |  |    This function MUST NOT decrement :c:data:`view->obj`, since that is
 | 
					
						
							| 
									
										
										
										
											2012-03-06 14:55:06 +01:00
										 |  |  |    done automatically in :c:func:`PyBuffer_Release` (this scheme is
 | 
					
						
							|  |  |  |    useful for breaking reference cycles).
 | 
					
						
							| 
									
										
										
										
											2008-01-20 09:30:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-25 12:24:21 +01:00
										 |  |  |    :c:func:`PyBuffer_Release` is the interface for the consumer that
 | 
					
						
							|  |  |  |    wraps this function.
 | 
					
						
							| 
									
										
										
										
											2015-05-21 11:50:30 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. _async-structs:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Async Object Structures
 | 
					
						
							|  |  |  | =======================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. sectionauthor:: Yury Selivanov <yselivanov@sprymix.com>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-21 17:02:31 -04:00
										 |  |  | .. versionadded:: 3.5
 | 
					
						
							| 
									
										
										
										
											2015-05-21 11:50:30 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. 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 {
 | 
					
						
							| 
									
										
										
										
											2015-05-28 11:21:31 -04:00
										 |  |  |             unaryfunc am_await;
 | 
					
						
							|  |  |  |             unaryfunc am_aiter;
 | 
					
						
							|  |  |  |             unaryfunc am_anext;
 | 
					
						
							| 
									
										
										
										
											2015-05-21 11:50:30 -04:00
										 |  |  |         } PyAsyncMethods;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-28 11:21:31 -04:00
										 |  |  | .. c:member:: unaryfunc PyAsyncMethods.am_await
 | 
					
						
							| 
									
										
										
										
											2015-05-21 11:50:30 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    The signature of this function is::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |       PyObject *am_await(PyObject *self);
 | 
					
						
							| 
									
										
										
										
											2015-05-21 11:50:30 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    The returned object must be an 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`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-28 11:21:31 -04:00
										 |  |  | .. c:member:: unaryfunc PyAsyncMethods.am_aiter
 | 
					
						
							| 
									
										
										
										
											2015-05-21 11:50:30 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    The signature of this function is::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |       PyObject *am_aiter(PyObject *self);
 | 
					
						
							| 
									
										
										
										
											2015-05-21 11:50:30 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Must return an :term:`awaitable` object.  See :meth:`__anext__` for details.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This slot may be set to *NULL* if an object does not implement
 | 
					
						
							|  |  |  |    asynchronous iteration protocol.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-28 11:21:31 -04:00
										 |  |  | .. c:member:: unaryfunc PyAsyncMethods.am_anext
 | 
					
						
							| 
									
										
										
										
											2015-05-21 11:50:30 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    The signature of this function is::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  |       PyObject *am_anext(PyObject *self);
 | 
					
						
							| 
									
										
										
										
											2015-05-21 11:50:30 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |    Must return an :term:`awaitable` object.  See :meth:`__anext__` for details.
 | 
					
						
							|  |  |  |    This slot may be set to *NULL*.
 | 
					
						
							| 
									
										
										
										
											2018-06-14 15:46:35 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. _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
 | 
					
						
							|  |  |  |    :attr:`ob_refcnt` set to ``1`` and :attr:`ob_type` set to the type argument.  If
 | 
					
						
							|  |  |  |    the type's :c:member:`~PyTypeObject.tp_itemsize` is non-zero, the object's :attr:`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)(PyObject *, 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:: int (*printfunc)(PyObject *, FILE *, int)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This is hidden if :const:`PY_LIMITED_API` is set.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. 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_descrget`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. c:type:: int (*descrsetfunc)(PyObject *, PyObject *, PyObject *)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    See :c:member:`~PyTypeObject.tp_descrset`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. 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:: PyObject *(*ternaryfunc)(PyObject *, PyObject *, PyObject *)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. c:type:: PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. c:type:: int (*ssizeobjargproc)(PyObject *, Py_ssize_t)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. c:type:: int (*objobjproc)(PyObject *, PyObject *)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. c:type:: int (*objobjargproc)(PyObject *, PyObject *, PyObject *)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. _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 static type::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    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 = "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_print */
 | 
					
						
							|  |  |  |        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 */
 | 
					
						
							|  |  |  |        "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;
 | 
					
						
							|  |  |  |        PyObject *inst_dict;
 | 
					
						
							|  |  |  |        PyObject *weakreflist;
 | 
					
						
							|  |  |  |    } MyObject;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    static PyTypeObject MyObject_Type = {
 | 
					
						
							|  |  |  |        PyVarObject_HEAD_INIT(NULL, 0)
 | 
					
						
							|  |  |  |        .tp_name = "mymod.MyObject",
 | 
					
						
							|  |  |  |        .tp_basicsize = sizeof(MyObject),
 | 
					
						
							|  |  |  |        .tp_doc = "My objects",
 | 
					
						
							|  |  |  |        .tp_weaklistoffset = offsetof(MyObject, weakreflist),
 | 
					
						
							|  |  |  |        .tp_dictoffset = offsetof(MyObject, inst_dict),
 | 
					
						
							|  |  |  |        .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
 | 
					
						
							|  |  |  |        .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)::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    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 = "my custom str",
 | 
					
						
							|  |  |  |        .tp_flags = Py_TPFLAGS_DEFAULT,
 | 
					
						
							|  |  |  |        .tp_new = NULL,
 | 
					
						
							|  |  |  |        .tp_repr = (reprfunc)myobj_repr,
 | 
					
						
							|  |  |  |    };
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The simplest static type (with fixed-length instances)::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    typedef struct {
 | 
					
						
							|  |  |  |        PyObject_HEAD
 | 
					
						
							|  |  |  |    } MyObject;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    static PyTypeObject MyObject_Type = {
 | 
					
						
							|  |  |  |        PyVarObject_HEAD_INIT(NULL, 0)
 | 
					
						
							|  |  |  |        .tp_name = "mymod.MyObject",
 | 
					
						
							|  |  |  |    };
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The simplest static type (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 *),
 | 
					
						
							|  |  |  |    };
 |