mirror of https://github.com/python/cpython
729 lines
25 KiB
ReStructuredText
729 lines
25 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 :c:member:`~PyVarObject.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 :c:member:`~PyVarObject.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 :ref:`METH_VARARGS | METH_KEYWORDS <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 :c:macro:`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 :ref:`METH_FASTCALL | METH_KEYWORDS <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 :ref:`METH_METHOD | METH_FASTCALL | METH_KEYWORDS <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:
|
||
|
||
.. c:member:: const char *ml_name
|
||
|
||
Name of the method.
|
||
|
||
.. c:member:: PyCFunction ml_meth
|
||
|
||
Pointer to the C implementation.
|
||
|
||
.. c:member:: int ml_flags
|
||
|
||
Flags bits indicating how the call should be constructed.
|
||
|
||
.. c:member:: const char *ml_doc
|
||
|
||
Points to the contents of the docstring.
|
||
|
||
The :c:member:`~PyMethodDef.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 :c:member:`~PyMethodDef.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:
|
||
|
||
.. c:macro:: 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`.
|
||
|
||
|
||
.. c:macro:: METH_KEYWORDS
|
||
|
||
Can only be used in certain combinations with other flags:
|
||
:ref:`METH_VARARGS | METH_KEYWORDS <METH_VARARGS-METH_KEYWORDS>`,
|
||
:ref:`METH_FASTCALL | METH_KEYWORDS <METH_FASTCALL-METH_KEYWORDS>` and
|
||
:ref:`METH_METHOD | METH_FASTCALL | METH_KEYWORDS <METH_METHOD-METH_FASTCALL-METH_KEYWORDS>`.
|
||
|
||
|
||
.. _METH_VARARGS-METH_KEYWORDS:
|
||
|
||
:c:expr:`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`.
|
||
|
||
|
||
.. c:macro:: 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 :ref:`stable ABI <stable-abi>`.
|
||
|
||
|
||
.. _METH_FASTCALL-METH_KEYWORDS:
|
||
|
||
:c:expr:`METH_FASTCALL | METH_KEYWORDS`
|
||
Extension of :c:macro:`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
|
||
|
||
|
||
.. c:macro:: METH_METHOD
|
||
|
||
Can only be used in the combination with other flags:
|
||
:ref:`METH_METHOD | METH_FASTCALL | METH_KEYWORDS <METH_METHOD-METH_FASTCALL-METH_KEYWORDS>`.
|
||
|
||
|
||
.. _METH_METHOD-METH_FASTCALL-METH_KEYWORDS:
|
||
|
||
:c:expr:`METH_METHOD | METH_FASTCALL | METH_KEYWORDS`
|
||
Extension of :ref:`METH_FASTCALL | METH_KEYWORDS <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
|
||
|
||
|
||
.. c:macro:: METH_NOARGS
|
||
|
||
Methods without parameters don't need to check whether arguments are given if
|
||
they are listed with the :c:macro:`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.
|
||
|
||
|
||
.. c:macro:: METH_O
|
||
|
||
Methods with a single object argument can be listed with the :c:macro:`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.
|
||
|
||
|
||
.. c:macro:: METH_CLASS
|
||
|
||
.. index:: pair: built-in function; 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.
|
||
|
||
|
||
.. c:macro:: METH_STATIC
|
||
|
||
.. index:: pair: built-in function; 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.
|
||
|
||
|
||
.. c:macro:: 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:`~object.__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.
|
||
|
||
.. c:function:: PyObject * PyCMethod_New(PyMethodDef *ml, PyObject *self, PyObject *module, PyTypeObject *cls)
|
||
|
||
Turn *ml* into a Python :term:`callable` object.
|
||
The caller must ensure that *ml* outlives the :term:`callable`.
|
||
Typically, *ml* is defined as a static variable.
|
||
|
||
The *self* parameter will be passed as the *self* argument
|
||
to the C function in ``ml->ml_meth`` when invoked.
|
||
*self* can be ``NULL``.
|
||
|
||
The :term:`callable` object's ``__module__`` attribute
|
||
can be set from the given *module* argument.
|
||
*module* should be a Python string,
|
||
which will be used as name of the module the function is defined in.
|
||
If unavailable, it can be set to :const:`None` or ``NULL``.
|
||
|
||
.. seealso:: :attr:`function.__module__`
|
||
|
||
The *cls* parameter will be passed as the *defining_class*
|
||
argument to the C function.
|
||
Must be set if :c:macro:`METH_METHOD` is set on ``ml->ml_flags``.
|
||
|
||
.. versionadded:: 3.9
|
||
|
||
|
||
.. c:function:: PyObject * PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module)
|
||
|
||
Equivalent to ``PyCMethod_New(ml, self, module, NULL)``.
|
||
|
||
|
||
.. c:function:: PyObject * PyCFunction_New(PyMethodDef *ml, PyObject *self)
|
||
|
||
Equivalent to ``PyCMethod_New(ml, self, NULL, NULL)``.
|
||
|
||
|
||
Accessing attributes of extension types
|
||
---------------------------------------
|
||
|
||
.. c:type:: PyMemberDef
|
||
|
||
Structure which describes an attribute of a type which corresponds to a C
|
||
struct member.
|
||
When defining a class, put a NULL-terminated array of these
|
||
structures in the :c:member:`~PyTypeObject.tp_members` slot.
|
||
|
||
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:: int type
|
||
|
||
The type of the member in the C struct.
|
||
See :ref:`PyMemberDef-types` for the possible values.
|
||
|
||
.. c:member:: Py_ssize_t offset
|
||
|
||
The offset in bytes that the member is located on the type’s object struct.
|
||
|
||
.. 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:`~PyMemberDef.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.
|
||
This member must be defined with ``Py_T_PYSSIZET``, and either
|
||
``Py_READONLY`` or ``Py_READONLY | Py_RELATIVE_OFFSET``. 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 :c:macro:`Py_TPFLAGS_MANAGED_DICT` and
|
||
:c:macro:`Py_TPFLAGS_MANAGED_WEAKREF` instead.
|
||
|
||
.. versionchanged:: 3.12
|
||
|
||
``PyMemberDef`` is always available.
|
||
Previously, it required including ``"structmember.h"``.
|
||
|
||
.. versionchanged:: 3.14
|
||
|
||
:c:macro:`Py_RELATIVE_OFFSET` is now allowed for
|
||
``"__vectorcalloffset__"``, ``"__dictoffset__"`` and
|
||
``"__weaklistoffset__"``.
|
||
|
||
.. 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.
|
||
|
||
.. c:macro:: Py_RELATIVE_OFFSET
|
||
|
||
Indicates that the :c:member:`~PyMemberDef.offset` of this ``PyMemberDef``
|
||
entry indicates an offset from the subclass-specific data, rather than
|
||
from ``PyObject``.
|
||
|
||
Can only be used as part of :c:member:`Py_tp_members <PyTypeObject.tp_members>`
|
||
:c:type:`slot <PyType_Slot>` when creating a class using negative
|
||
:c:member:`~PyType_Spec.basicsize`.
|
||
It is mandatory in that case.
|
||
|
||
This flag is only used in :c:type:`PyType_Slot`.
|
||
When setting :c:member:`~PyTypeObject.tp_members` during
|
||
class creation, Python clears it and sets
|
||
:c:member:`PyMemberDef.offset` to the offset from the ``PyObject`` struct.
|
||
|
||
.. index::
|
||
single: READ_RESTRICTED (C macro)
|
||
single: WRITE_RESTRICTED (C macro)
|
||
single: RESTRICTED (C macro)
|
||
|
||
.. versionchanged:: 3.10
|
||
|
||
The :c:macro:`!RESTRICTED`, :c:macro:`!READ_RESTRICTED` and
|
||
:c:macro:`!WRITE_RESTRICTED` macros available with
|
||
``#include "structmember.h"`` are deprecated.
|
||
:c:macro:`!READ_RESTRICTED` and :c:macro:`!RESTRICTED` are equivalent to
|
||
:c:macro:`Py_AUDIT_READ`; :c:macro:`!WRITE_RESTRICTED` does nothing.
|
||
|
||
.. index::
|
||
single: READONLY (C macro)
|
||
|
||
.. versionchanged:: 3.12
|
||
|
||
The :c:macro:`!READONLY` macro was renamed to :c:macro:`Py_READONLY`.
|
||
The :c:macro:`!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_INPLACE` 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 (C macro)
|
||
single: T_SHORT (C macro)
|
||
single: T_INT (C macro)
|
||
single: T_LONG (C macro)
|
||
single: T_LONGLONG (C macro)
|
||
single: T_UBYTE (C macro)
|
||
single: T_USHORT (C macro)
|
||
single: T_UINT (C macro)
|
||
single: T_ULONG (C macro)
|
||
single: T_ULONGULONG (C macro)
|
||
single: T_PYSSIZET (C macro)
|
||
single: T_FLOAT (C macro)
|
||
single: T_DOUBLE (C macro)
|
||
single: T_BOOL (C macro)
|
||
single: T_CHAR (C macro)
|
||
single: T_STRING (C macro)
|
||
single: T_STRING_INPLACE (C macro)
|
||
single: T_OBJECT_EX (C macro)
|
||
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* name
|
||
|
||
attribute name
|
||
|
||
.. c:member:: getter get
|
||
|
||
C function to get the attribute.
|
||
|
||
.. c:member:: setter set
|
||
|
||
Optional C function to set or delete the attribute.
|
||
If ``NULL``, the attribute is read-only.
|
||
|
||
.. c:member:: const char* doc
|
||
|
||
optional docstring
|
||
|
||
.. c:member:: void* closure
|
||
|
||
Optional user data pointer, providing additional data for getter and setter.
|
||
|
||
.. c:type:: PyObject *(*getter)(PyObject *, void *)
|
||
|
||
The ``get`` function takes one :c:expr:`PyObject*` parameter (the
|
||
instance) and a user data pointer (the associated ``closure``):
|
||
|
||
It should return a new reference on success or ``NULL`` with a set exception
|
||
on failure.
|
||
|
||
.. c:type:: int (*setter)(PyObject *, PyObject *, void *)
|
||
|
||
``set`` functions take two :c:expr:`PyObject*` parameters (the instance and
|
||
the value to be set) and a user data pointer (the associated ``closure``):
|
||
|
||
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.
|