@@ -28,18 +28,52 @@ under :ref:`reference counting <countingrefs>`.
2828 object. In a normal "release" build, it contains only the object's
2929 reference count and a pointer to the corresponding type object.
3030 Nothing is actually declared to be a :c:type: `PyObject `, but every pointer
31- to a Python object can be cast to a :c:expr: `PyObject* `. Access to the
32- members must be done by using the macros :c:macro: `Py_REFCNT ` and
33- :c:macro: `Py_TYPE `.
31+ to a Python object can be cast to a :c:expr: `PyObject* `.
32+
33+ The members must not be accessed directly; instead use macros such as
34+ :c:macro: `Py_REFCNT ` and :c:macro: `Py_TYPE `.
35+
36+ .. c :member :: Py_ssize_t ob_refcnt
37+
38+ The object's reference count, as returned by :c:macro: `Py_REFCNT `.
39+ Do not use this field directly; instead use functions and macros such as
40+ :c:macro: `!Py_REFCNT `, :c:func: `Py_INCREF ` and :c:func: `Py_DecRef `.
41+
42+ The field type may be different from ``Py_ssize_t ``, depending on
43+ build configuration and platform.
44+
45+ .. c :member :: PyTypeObject* ob_type
46+
47+ The object's type.
48+ Do not use this field directly; use :c:macro: `Py_TYPE ` and
49+ :c:func: `Py_SET_TYPE ` instead.
3450
3551
3652.. c :type :: PyVarObject
3753
38- This is an extension of :c:type: `PyObject ` that adds the :c:member: `~PyVarObject.ob_size `
39- field. This is only used for objects that have some notion of *length *.
40- This type does not often appear in the Python/C API.
41- Access to the members must be done by using the macros
42- :c:macro: `Py_REFCNT `, :c:macro: `Py_TYPE `, and :c:macro: `Py_SIZE `.
54+ An extension of :c:type: `PyObject ` that adds the
55+ :c:member: `~PyVarObject.ob_size ` field.
56+ This is intended for objects that have some notion of *length *.
57+
58+ As with :c:type: `!PyObject `, the members must not be accessed directly;
59+ instead use macros such as :c:macro: `Py_SIZE `, :c:macro: `Py_REFCNT ` and
60+ :c:macro: `Py_TYPE `.
61+
62+ .. c :member :: Py_ssize_t ob_size
63+
64+ A size field, whose contents should be considered an object's internal
65+ implementation detail.
66+
67+ Do not use this field directly; use :c:macro: `Py_SIZE ` instead.
68+
69+ Object creation functions such as :c:func: `PyObject_NewVar ` will
70+ generally set this field to the requested size (number of items).
71+ After creation, arbitrary values can be stored in :c:member: `!ob_size `
72+ using :c:macro: `Py_SET_SIZE `.
73+
74+ To get an object's publicly exposed length, as returned by
75+ the Python function :py:func: `len `, use :c:func: `PyObject_Length `
76+ instead.
4377
4478
4579.. c :macro :: PyObject_HEAD
@@ -103,9 +137,8 @@ under :ref:`reference counting <countingrefs>`.
103137
104138 Get the type of the Python object *o *.
105139
106- Return a :term: `borrowed reference `.
107-
108- Use the :c:func: `Py_SET_TYPE ` function to set an object type.
140+ The returned reference is :term: `borrowed <borrowed reference> ` from *o *.
141+ Do not release it with :c:func: `Py_DECREF ` or similar.
109142
110143 .. versionchanged :: 3.11
111144 :c:func: `Py_TYPE() ` is changed to an inline static function.
@@ -122,16 +155,26 @@ under :ref:`reference counting <countingrefs>`.
122155
123156.. c :function :: void Py_SET_TYPE (PyObject *o, PyTypeObject *type)
124157
125- Set the object *o * type to *type *.
158+ Set the type of object *o * to *type *, without any checking or reference
159+ counting.
160+
161+ This is a very low-level operation.
162+ Consider instead setting the Python attribute :attr: `~object.__class__ `
163+ using :c:func: `PyObject_SetAttrString ` or similar.
164+
165+ Note that assigning an incompatible type can lead to undefined behavior.
166+
167+ If *type * is a :ref: `heap type <heap-types >`, the caller must create a
168+ new reference to it.
169+ Similarly, if the old type of *o * is a heap type, the caller must release
170+ a reference to that type.
126171
127172 .. versionadded :: 3.9
128173
129174
130175.. c :function :: Py_ssize_t Py_SIZE (PyVarObject *o)
131176
132- Get the size of the Python object *o *.
133-
134- Use the :c:func: `Py_SET_SIZE ` function to set an object size.
177+ Get the :c:member: `~PyVarObject.ob_size ` field of *o *.
135178
136179 .. versionchanged :: 3.11
137180 :c:func: `Py_SIZE() ` is changed to an inline static function.
@@ -140,7 +183,7 @@ under :ref:`reference counting <countingrefs>`.
140183
141184.. c :function :: void Py_SET_SIZE (PyVarObject *o, Py_ssize_t size)
142185
143- Set the object *o * size to *size *.
186+ Set the :c:member: ` ~PyVarObject.ob_size ` field of *o * to *size *.
144187
145188 .. versionadded :: 3.9
146189
0 commit comments