mirror of https://github.com/python/cpython
646 lines
22 KiB
ReStructuredText
646 lines
22 KiB
ReStructuredText
.. highlight:: c
|
||
|
||
.. _common-structs:
|
||
|
||
Common Object Structures
|
||
========================
|
||
|
||
There are a large number of structures which are used in the definition of
|
||
object types for Python. This section describes these structures and how they
|
||
are used.
|
||
|
||
|
||
Base object types and macros
|
||
----------------------------
|
||
|
||
All Python objects ultimately share a small number of fields at the beginning
|
||
of the object's representation in memory. These are represented by the
|
||
:c:type:`PyObject` and :c:type:`PyVarObject` types, which are defined, in turn,
|
||
by the expansions of some macros also used, whether directly or indirectly, in
|
||
the definition of all other Python objects. Additional macros can be found
|
||
under :ref:`reference counting <countingrefs>`.
|
||
|
||
|
||
.. c:type:: PyObject
|
||
|
||
All object types are extensions of this type. This is a type which
|
||
contains the information Python needs to treat a pointer to an object as an
|
||
object. In a normal "release" build, it contains only the object's
|
||
reference count and a pointer to the corresponding type object.
|
||
Nothing is actually declared to be a :c:type:`PyObject`, but every pointer
|
||
to a Python object can be cast to a :c:expr:`PyObject*`. Access to the
|
||
members must be done by using the macros :c:macro:`Py_REFCNT` and
|
||
:c:macro:`Py_TYPE`.
|
||
|
||
|
||
.. c:type:: PyVarObject
|
||
|
||
This is an extension of :c:type:`PyObject` that adds the :attr:`ob_size`
|
||
field. This is only used for objects that have some notion of *length*.
|
||
This type does not often appear in the Python/C API.
|
||
Access to the members must be done by using the macros
|
||
:c:macro:`Py_REFCNT`, :c:macro:`Py_TYPE`, and :c:macro:`Py_SIZE`.
|
||
|
||
|
||
.. c:macro:: PyObject_HEAD
|
||
|
||
This is a macro used when declaring new types which represent objects
|
||
without a varying length. The PyObject_HEAD macro expands to::
|
||
|
||
PyObject ob_base;
|
||
|
||
See documentation of :c:type:`PyObject` above.
|
||
|
||
|
||
.. c:macro:: PyObject_VAR_HEAD
|
||
|
||
This is a macro used when declaring new types which represent objects
|
||
with a length that varies from instance to instance.
|
||
The PyObject_VAR_HEAD macro expands to::
|
||
|
||
PyVarObject ob_base;
|
||
|
||
See documentation of :c:type:`PyVarObject` above.
|
||
|
||
|
||
.. c:function:: int Py_Is(PyObject *x, PyObject *y)
|
||
|
||
Test if the *x* object is the *y* object, the same as ``x is y`` in Python.
|
||
|
||
.. versionadded:: 3.10
|
||
|
||
|
||
.. c:function:: int Py_IsNone(PyObject *x)
|
||
|
||
Test if an object is the ``None`` singleton,
|
||
the same as ``x is None`` in Python.
|
||
|
||
.. versionadded:: 3.10
|
||
|
||
|
||
.. c:function:: int Py_IsTrue(PyObject *x)
|
||
|
||
Test if an object is the ``True`` singleton,
|
||
the same as ``x is True`` in Python.
|
||
|
||
.. versionadded:: 3.10
|
||
|
||
|
||
.. c:function:: int Py_IsFalse(PyObject *x)
|
||
|
||
Test if an object is the ``False`` singleton,
|
||
the same as ``x is False`` in Python.
|
||
|
||
.. versionadded:: 3.10
|
||
|
||
|
||
.. c:function:: PyTypeObject* Py_TYPE(PyObject *o)
|
||
|
||
Get the type of the Python object *o*.
|
||
|
||
Return a :term:`borrowed reference`.
|
||
|
||
Use the :c:func:`Py_SET_TYPE` function to set an object type.
|
||
|
||
.. versionchanged:: 3.11
|
||
:c:func:`Py_TYPE()` is changed to an inline static function.
|
||
The parameter type is no longer :c:expr:`const PyObject*`.
|
||
|
||
|
||
.. c:function:: int Py_IS_TYPE(PyObject *o, PyTypeObject *type)
|
||
|
||
Return non-zero if the object *o* type is *type*. Return zero otherwise.
|
||
Equivalent to: ``Py_TYPE(o) == type``.
|
||
|
||
.. versionadded:: 3.9
|
||
|
||
|
||
.. c:function:: void Py_SET_TYPE(PyObject *o, PyTypeObject *type)
|
||
|
||
Set the object *o* type to *type*.
|
||
|
||
.. versionadded:: 3.9
|
||
|
||
|
||
.. c:function:: Py_ssize_t Py_SIZE(PyVarObject *o)
|
||
|
||
Get the size of the Python object *o*.
|
||
|
||
Use the :c:func:`Py_SET_SIZE` function to set an object size.
|
||
|
||
.. versionchanged:: 3.11
|
||
:c:func:`Py_SIZE()` is changed to an inline static function.
|
||
The parameter type is no longer :c:expr:`const PyVarObject*`.
|
||
|
||
|
||
.. c:function:: void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size)
|
||
|
||
Set the object *o* size to *size*.
|
||
|
||
.. versionadded:: 3.9
|
||
|
||
|
||
.. c:macro:: PyObject_HEAD_INIT(type)
|
||
|
||
This is a macro which expands to initialization values for a new
|
||
:c:type:`PyObject` type. This macro expands to::
|
||
|
||
_PyObject_EXTRA_INIT
|
||
1, type,
|
||
|
||
|
||
.. c:macro:: PyVarObject_HEAD_INIT(type, size)
|
||
|
||
This is a macro which expands to initialization values for a new
|
||
:c:type:`PyVarObject` type, including the :attr:`ob_size` field.
|
||
This macro expands to::
|
||
|
||
_PyObject_EXTRA_INIT
|
||
1, type, size,
|
||
|
||
|
||
Implementing functions and methods
|
||
----------------------------------
|
||
|
||
.. c:type:: PyCFunction
|
||
|
||
Type of the functions used to implement most Python callables in C.
|
||
Functions of this type take two :c:expr:`PyObject*` parameters and return
|
||
one such value. If the return value is ``NULL``, an exception shall have
|
||
been set. If not ``NULL``, the return value is interpreted as the return
|
||
value of the function as exposed in Python. The function must return a new
|
||
reference.
|
||
|
||
The function signature is::
|
||
|
||
PyObject *PyCFunction(PyObject *self,
|
||
PyObject *args);
|
||
|
||
.. c:type:: PyCFunctionWithKeywords
|
||
|
||
Type of the functions used to implement Python callables in C
|
||
with signature :const:`METH_VARARGS | METH_KEYWORDS`.
|
||
The function signature is::
|
||
|
||
PyObject *PyCFunctionWithKeywords(PyObject *self,
|
||
PyObject *args,
|
||
PyObject *kwargs);
|
||
|
||
|
||
.. c:type:: _PyCFunctionFast
|
||
|
||
Type of the functions used to implement Python callables in C
|
||
with signature :const:`METH_FASTCALL`.
|
||
The function signature is::
|
||
|
||
PyObject *_PyCFunctionFast(PyObject *self,
|
||
PyObject *const *args,
|
||
Py_ssize_t nargs);
|
||
|
||
.. c:type:: _PyCFunctionFastWithKeywords
|
||
|
||
Type of the functions used to implement Python callables in C
|
||
with signature :const:`METH_FASTCALL | METH_KEYWORDS`.
|
||
The function signature is::
|
||
|
||
PyObject *_PyCFunctionFastWithKeywords(PyObject *self,
|
||
PyObject *const *args,
|
||
Py_ssize_t nargs,
|
||
PyObject *kwnames);
|
||
|
||
.. c:type:: PyCMethod
|
||
|
||
Type of the functions used to implement Python callables in C
|
||
with signature :const:`METH_METHOD | METH_FASTCALL | METH_KEYWORDS`.
|
||
The function signature is::
|
||
|
||
PyObject *PyCMethod(PyObject *self,
|
||
PyTypeObject *defining_class,
|
||
PyObject *const *args,
|
||
Py_ssize_t nargs,
|
||
PyObject *kwnames)
|
||
|
||
.. versionadded:: 3.9
|
||
|
||
|
||
.. c:type:: PyMethodDef
|
||
|
||
Structure used to describe a method of an extension type. This structure has
|
||
four fields:
|
||
|
||
+------------------+---------------+-------------------------------+
|
||
| Field | C Type | Meaning |
|
||
+==================+===============+===============================+
|
||
| :attr:`ml_name` | const char \* | name of the method |
|
||
+------------------+---------------+-------------------------------+
|
||
| :attr:`ml_meth` | PyCFunction | pointer to the C |
|
||
| | | implementation |
|
||
+------------------+---------------+-------------------------------+
|
||
| :attr:`ml_flags` | int | flag bits indicating how the |
|
||
| | | call should be constructed |
|
||
+------------------+---------------+-------------------------------+
|
||
| :attr:`ml_doc` | const char \* | points to the contents of the |
|
||
| | | docstring |
|
||
+------------------+---------------+-------------------------------+
|
||
|
||
The :attr:`ml_meth` is a C function pointer. The functions may be of different
|
||
types, but they always return :c:expr:`PyObject*`. If the function is not of
|
||
the :c:type:`PyCFunction`, the compiler will require a cast in the method table.
|
||
Even though :c:type:`PyCFunction` defines the first parameter as
|
||
:c:expr:`PyObject*`, it is common that the method implementation uses the
|
||
specific C type of the *self* object.
|
||
|
||
The :attr:`ml_flags` field is a bitfield which can include the following flags.
|
||
The individual flags indicate either a calling convention or a binding
|
||
convention.
|
||
|
||
There are these calling conventions:
|
||
|
||
.. data:: METH_VARARGS
|
||
|
||
This is the typical calling convention, where the methods have the type
|
||
:c:type:`PyCFunction`. The function expects two :c:expr:`PyObject*` values.
|
||
The first one is the *self* object for methods; for module functions, it is
|
||
the module object. The second parameter (often called *args*) is a tuple
|
||
object representing all arguments. This parameter is typically processed
|
||
using :c:func:`PyArg_ParseTuple` or :c:func:`PyArg_UnpackTuple`.
|
||
|
||
|
||
.. data:: METH_VARARGS | METH_KEYWORDS
|
||
|
||
Methods with these flags must be of type :c:type:`PyCFunctionWithKeywords`.
|
||
The function expects three parameters: *self*, *args*, *kwargs* where
|
||
*kwargs* is a dictionary of all the keyword arguments or possibly ``NULL``
|
||
if there are no keyword arguments. The parameters are typically processed
|
||
using :c:func:`PyArg_ParseTupleAndKeywords`.
|
||
|
||
|
||
.. data:: METH_FASTCALL
|
||
|
||
Fast calling convention supporting only positional arguments.
|
||
The methods have the type :c:type:`_PyCFunctionFast`.
|
||
The first parameter is *self*, the second parameter is a C array
|
||
of :c:expr:`PyObject*` values indicating the arguments and the third
|
||
parameter is the number of arguments (the length of the array).
|
||
|
||
.. versionadded:: 3.7
|
||
|
||
.. versionchanged:: 3.10
|
||
|
||
``METH_FASTCALL`` is now part of the stable ABI.
|
||
|
||
|
||
.. data:: METH_FASTCALL | METH_KEYWORDS
|
||
|
||
Extension of :const:`METH_FASTCALL` supporting also keyword arguments,
|
||
with methods of type :c:type:`_PyCFunctionFastWithKeywords`.
|
||
Keyword arguments are passed the same way as in the
|
||
:ref:`vectorcall protocol <vectorcall>`:
|
||
there is an additional fourth :c:expr:`PyObject*` parameter
|
||
which is a tuple representing the names of the keyword arguments
|
||
(which are guaranteed to be strings)
|
||
or possibly ``NULL`` if there are no keywords. The values of the keyword
|
||
arguments are stored in the *args* array, after the positional arguments.
|
||
|
||
.. versionadded:: 3.7
|
||
|
||
|
||
.. data:: METH_METHOD | METH_FASTCALL | METH_KEYWORDS
|
||
|
||
Extension of :const:`METH_FASTCALL | METH_KEYWORDS` supporting the *defining
|
||
class*, that is, the class that contains the method in question.
|
||
The defining class might be a superclass of ``Py_TYPE(self)``.
|
||
|
||
The method needs to be of type :c:type:`PyCMethod`, the same as for
|
||
``METH_FASTCALL | METH_KEYWORDS`` with ``defining_class`` argument added after
|
||
``self``.
|
||
|
||
.. versionadded:: 3.9
|
||
|
||
|
||
.. data:: METH_NOARGS
|
||
|
||
Methods without parameters don't need to check whether arguments are given if
|
||
they are listed with the :const:`METH_NOARGS` flag. They need to be of type
|
||
:c:type:`PyCFunction`. The first parameter is typically named *self* and will
|
||
hold a reference to the module or object instance. In all cases the second
|
||
parameter will be ``NULL``.
|
||
|
||
The function must have 2 parameters. Since the second parameter is unused,
|
||
:c:macro:`Py_UNUSED` can be used to prevent a compiler warning.
|
||
|
||
|
||
.. data:: METH_O
|
||
|
||
Methods with a single object argument can be listed with the :const:`METH_O`
|
||
flag, instead of invoking :c:func:`PyArg_ParseTuple` with a ``"O"`` argument.
|
||
They have the type :c:type:`PyCFunction`, with the *self* parameter, and a
|
||
:c:expr:`PyObject*` parameter representing the single argument.
|
||
|
||
|
||
These two constants are not used to indicate the calling convention but the
|
||
binding when use with methods of classes. These may not be used for functions
|
||
defined for modules. At most one of these flags may be set for any given
|
||
method.
|
||
|
||
|
||
.. data:: METH_CLASS
|
||
|
||
.. index:: builtin: classmethod
|
||
|
||
The method will be passed the type object as the first parameter rather
|
||
than an instance of the type. This is used to create *class methods*,
|
||
similar to what is created when using the :func:`classmethod` built-in
|
||
function.
|
||
|
||
|
||
.. data:: METH_STATIC
|
||
|
||
.. index:: builtin: staticmethod
|
||
|
||
The method will be passed ``NULL`` as the first parameter rather than an
|
||
instance of the type. This is used to create *static methods*, similar to
|
||
what is created when using the :func:`staticmethod` built-in function.
|
||
|
||
One other constant controls whether a method is loaded in place of another
|
||
definition with the same method name.
|
||
|
||
|
||
.. data:: METH_COEXIST
|
||
|
||
The method will be loaded in place of existing definitions. Without
|
||
*METH_COEXIST*, the default is to skip repeated definitions. Since slot
|
||
wrappers are loaded before the method table, the existence of a
|
||
*sq_contains* slot, for example, would generate a wrapped method named
|
||
:meth:`__contains__` and preclude the loading of a corresponding
|
||
PyCFunction with the same name. With the flag defined, the PyCFunction
|
||
will be loaded in place of the wrapper object and will co-exist with the
|
||
slot. This is helpful because calls to PyCFunctions are optimized more
|
||
than wrapper object calls.
|
||
|
||
|
||
Accessing attributes of extension types
|
||
---------------------------------------
|
||
|
||
.. c:type:: PyMemberDef
|
||
|
||
Structure which describes an attribute of a type which corresponds to a C
|
||
struct member. Its fields are, in order:
|
||
|
||
.. c:member:: const char* name
|
||
|
||
Name of the member.
|
||
A NULL value marks the end of a ``PyMemberDef[]`` array.
|
||
|
||
The string should be static, no copy is made of it.
|
||
|
||
.. c:member:: Py_ssize_t PyMemberDef.offset
|
||
|
||
The offset in bytes that the member is located on the type’s object struct.
|
||
|
||
.. c:member:: int type
|
||
|
||
The type of the member in the C struct.
|
||
See :ref:`PyMemberDef-types` for the possible values.
|
||
|
||
.. c:member:: int flags
|
||
|
||
Zero or more of the :ref:`PyMemberDef-flags`, combined using bitwise OR.
|
||
|
||
.. c:member:: const char* doc
|
||
|
||
The docstring, or NULL.
|
||
The string should be static, no copy is made of it.
|
||
Typically, it is defined using :c:macro:`PyDoc_STR`.
|
||
|
||
By default (when :c:member:`flags` is ``0``), members allow
|
||
both read and write access.
|
||
Use the :c:macro:`Py_READONLY` flag for read-only access.
|
||
Certain types, like :c:macro:`Py_T_STRING`, imply :c:macro:`Py_READONLY`.
|
||
Only :c:macro:`Py_T_OBJECT_EX` (and legacy :c:macro:`T_OBJECT`) members can
|
||
be deleted.
|
||
|
||
.. _pymemberdef-offsets:
|
||
|
||
For heap-allocated types (created using :c:func:`PyType_FromSpec` or similar),
|
||
``PyMemberDef`` may contain a definition for the special member
|
||
``"__vectorcalloffset__"``, corresponding to
|
||
:c:member:`~PyTypeObject.tp_vectorcall_offset` in type objects.
|
||
These must be defined with ``Py_T_PYSSIZET`` and ``Py_READONLY``, for example::
|
||
|
||
static PyMemberDef spam_type_members[] = {
|
||
{"__vectorcalloffset__", Py_T_PYSSIZET,
|
||
offsetof(Spam_object, vectorcall), Py_READONLY},
|
||
{NULL} /* Sentinel */
|
||
};
|
||
|
||
(You may need to ``#include <stddef.h>`` for :c:func:`!offsetof`.)
|
||
|
||
The legacy offsets :c:member:`~PyTypeObject.tp_dictoffset` and
|
||
:c:member:`~PyTypeObject.tp_weaklistoffset` can be defined similarly using
|
||
``"__dictoffset__"`` and ``"__weaklistoffset__"`` members, but extensions
|
||
are strongly encouraged to use :const:`Py_TPFLAGS_MANAGED_DICT` and
|
||
:const:`Py_TPFLAGS_MANAGED_WEAKREF` instead.
|
||
|
||
.. versionchanged:: 3.12
|
||
|
||
``PyMemberDef`` is always available.
|
||
Previously, it required including ``"structmember.h"``.
|
||
|
||
.. c:function:: PyObject* PyMember_GetOne(const char *obj_addr, struct PyMemberDef *m)
|
||
|
||
Get an attribute belonging to the object at address *obj_addr*. The
|
||
attribute is described by ``PyMemberDef`` *m*. Returns ``NULL``
|
||
on error.
|
||
|
||
.. versionchanged:: 3.12
|
||
|
||
``PyMember_GetOne`` is always available.
|
||
Previously, it required including ``"structmember.h"``.
|
||
|
||
.. c:function:: int PyMember_SetOne(char *obj_addr, struct PyMemberDef *m, PyObject *o)
|
||
|
||
Set an attribute belonging to the object at address *obj_addr* to object *o*.
|
||
The attribute to set is described by ``PyMemberDef`` *m*. Returns ``0``
|
||
if successful and a negative value on failure.
|
||
|
||
.. versionchanged:: 3.12
|
||
|
||
``PyMember_SetOne`` is always available.
|
||
Previously, it required including ``"structmember.h"``.
|
||
|
||
.. _PyMemberDef-flags:
|
||
|
||
Member flags
|
||
^^^^^^^^^^^^
|
||
|
||
The following flags can be used with :c:member:`PyMemberDef.flags`:
|
||
|
||
.. c:macro:: Py_READONLY
|
||
|
||
Not writable.
|
||
|
||
.. c:macro:: Py_AUDIT_READ
|
||
|
||
Emit an ``object.__getattr__`` :ref:`audit event <audit-events>`
|
||
before reading.
|
||
|
||
.. index::
|
||
single: READ_RESTRICTED
|
||
single: WRITE_RESTRICTED
|
||
single: RESTRICTED
|
||
|
||
.. versionchanged:: 3.10
|
||
|
||
The :const:`!RESTRICTED`, :const:`!READ_RESTRICTED` and
|
||
:const:`!WRITE_RESTRICTED` macros available with
|
||
``#include "structmember.h"`` are deprecated.
|
||
:const:`!READ_RESTRICTED` and :const:`!RESTRICTED` are equivalent to
|
||
:const:`Py_AUDIT_READ`; :const:`!WRITE_RESTRICTED` does nothing.
|
||
|
||
.. index::
|
||
single: READONLY
|
||
|
||
.. versionchanged:: 3.12
|
||
|
||
The :const:`!READONLY` macro was renamed to :const:`Py_READONLY`.
|
||
The :const:`!PY_AUDIT_READ` macro was renamed with the ``Py_`` prefix.
|
||
The new names are now always available.
|
||
Previously, these required ``#include "structmember.h"``.
|
||
The header is still available and it provides the old names.
|
||
|
||
.. _PyMemberDef-types:
|
||
|
||
Member types
|
||
^^^^^^^^^^^^
|
||
|
||
:c:member:`PyMemberDef.type` can be one of the following macros corresponding
|
||
to various C types.
|
||
When the member is accessed in Python, it will be converted to the
|
||
equivalent Python type.
|
||
When it is set from Python, it will be converted back to the C type.
|
||
If that is not possible, an exception such as :exc:`TypeError` or
|
||
:exc:`ValueError` is raised.
|
||
|
||
Unless marked (D), attributes defined this way cannot be deleted
|
||
using e.g. :keyword:`del` or :py:func:`delattr`.
|
||
|
||
================================ ============================= ======================
|
||
Macro name C type Python type
|
||
================================ ============================= ======================
|
||
.. c:macro:: Py_T_BYTE :c:expr:`char` :py:class:`int`
|
||
.. c:macro:: Py_T_SHORT :c:expr:`short` :py:class:`int`
|
||
.. c:macro:: Py_T_INT :c:expr:`int` :py:class:`int`
|
||
.. c:macro:: Py_T_LONG :c:expr:`long` :py:class:`int`
|
||
.. c:macro:: Py_T_LONGLONG :c:expr:`long long` :py:class:`int`
|
||
.. c:macro:: Py_T_UBYTE :c:expr:`unsigned char` :py:class:`int`
|
||
.. c:macro:: Py_T_UINT :c:expr:`unsigned int` :py:class:`int`
|
||
.. c:macro:: Py_T_USHORT :c:expr:`unsigned short` :py:class:`int`
|
||
.. c:macro:: Py_T_ULONG :c:expr:`unsigned long` :py:class:`int`
|
||
.. c:macro:: Py_T_ULONGLONG :c:expr:`unsigned long long` :py:class:`int`
|
||
.. c:macro:: Py_T_PYSSIZET :c:expr:`Py_ssize_t` :py:class:`int`
|
||
.. c:macro:: Py_T_FLOAT :c:expr:`float` :py:class:`float`
|
||
.. c:macro:: Py_T_DOUBLE :c:expr:`double` :py:class:`float`
|
||
.. c:macro:: Py_T_BOOL :c:expr:`char` :py:class:`bool`
|
||
(written as 0 or 1)
|
||
.. c:macro:: Py_T_STRING :c:expr:`const char *` (*) :py:class:`str` (RO)
|
||
.. c:macro:: Py_T_STRING_INPLACE :c:expr:`const char[]` (*) :py:class:`str` (RO)
|
||
.. c:macro:: Py_T_CHAR :c:expr:`char` (0-127) :py:class:`str` (**)
|
||
.. c:macro:: Py_T_OBJECT_EX :c:expr:`PyObject *` :py:class:`object` (D)
|
||
================================ ============================= ======================
|
||
|
||
(*): Zero-terminated, UTF8-encoded C string.
|
||
With :c:macro:`!Py_T_STRING` the C representation is a pointer;
|
||
with :c:macro:`!Py_T_STRING_INLINE` the string is stored directly
|
||
in the structure.
|
||
|
||
(**): String of length 1. Only ASCII is accepted.
|
||
|
||
(RO): Implies :c:macro:`Py_READONLY`.
|
||
|
||
(D): Can be deleted, in which case the pointer is set to ``NULL``.
|
||
Reading a ``NULL`` pointer raises :py:exc:`AttributeError`.
|
||
|
||
.. index::
|
||
single: T_BYTE
|
||
single: T_SHORT
|
||
single: T_INT
|
||
single: T_LONG
|
||
single: T_LONGLONG
|
||
single: T_UBYTE
|
||
single: T_USHORT
|
||
single: T_UINT
|
||
single: T_ULONG
|
||
single: T_ULONGULONG
|
||
single: T_PYSSIZET
|
||
single: T_FLOAT
|
||
single: T_DOUBLE
|
||
single: T_BOOL
|
||
single: T_CHAR
|
||
single: T_STRING
|
||
single: T_STRING_INPLACE
|
||
single: T_OBJECT_EX
|
||
single: structmember.h
|
||
|
||
.. versionadded:: 3.12
|
||
|
||
In previous versions, the macros were only available with
|
||
``#include "structmember.h"`` and were named without the ``Py_`` prefix
|
||
(e.g. as ``T_INT``).
|
||
The header is still available and contains the old names, along with
|
||
the following deprecated types:
|
||
|
||
.. c:macro:: T_OBJECT
|
||
|
||
Like ``Py_T_OBJECT_EX``, but ``NULL`` is converted to ``None``.
|
||
This results in surprising behavior in Python: deleting the attribute
|
||
effectively sets it to ``None``.
|
||
|
||
.. c:macro:: T_NONE
|
||
|
||
Always ``None``. Must be used with :c:macro:`Py_READONLY`.
|
||
|
||
Defining Getters and Setters
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
|
||
.. c:type:: PyGetSetDef
|
||
|
||
Structure to define property-like access for a type. See also description of
|
||
the :c:member:`PyTypeObject.tp_getset` slot.
|
||
|
||
.. c:member:: const char* PyGetSetDef.name
|
||
|
||
attribute name
|
||
|
||
.. c:member:: getter PyGetSetDef.get
|
||
|
||
C funtion to get the attribute.
|
||
|
||
.. c:member:: setter PyGetSetDef.set
|
||
|
||
Optional C function to set or delete the attribute, if omitted the attribute is readonly.
|
||
|
||
.. c:member:: const char* PyGetSetDef.doc
|
||
|
||
optional docstring
|
||
|
||
.. c:member:: void* PyGetSetDef.closure
|
||
|
||
Optional function pointer, providing additional data for getter and setter.
|
||
|
||
The ``get`` function takes one :c:expr:`PyObject*` parameter (the
|
||
instance) and a function pointer (the associated ``closure``)::
|
||
|
||
typedef PyObject *(*getter)(PyObject *, void *);
|
||
|
||
It should return a new reference on success or ``NULL`` with a set exception
|
||
on failure.
|
||
|
||
``set`` functions take two :c:expr:`PyObject*` parameters (the instance and
|
||
the value to be set) and a function pointer (the associated ``closure``)::
|
||
|
||
typedef int (*setter)(PyObject *, PyObject *, void *);
|
||
|
||
In case the attribute should be deleted the second parameter is ``NULL``.
|
||
Should return ``0`` on success or ``-1`` with a set exception on failure.
|